QEventLoop loop;
QObject::connect(m_socket, &QAbstractSocket::connected, this, [&]() {
setState(Interface::State::Run);
loop.quit();
result = true;
});
QObject::connect(m_socket, &QAbstractSocket::errorOccurred, this, [&]() {
loop.quit();
result = false;
});
m_socket->connectToHost(m_settings.ip, m_settings.port, QIODevice::ReadWrite, QAbstractSocket::IPv4Protocol);
loop.exec();
return result;
}
Уважаемые знатоки, добрый день! Можно ли дождаться от сокета состояния подключения более лаконично, без захвата в лямбду локальных переменных? 🧐 В члены класса их выносить особо не хочется. m_socket - инстанс QTcpSocket
Сделать все асинхронно. Будет лаконично
тебе синхронно надо?
По-хорошему да, надо сразу понимать, удалось подключиться, или нет
socket->connectToHost(...); quint64 now=QDateTime::currentMsecsFromEpoch(); while (socket->state() == QAbstractSocket::ConnectingState && QDateTime::currentMsecsFromEpoch() - now < TIMEOUT) { QThread::msleep(10); qApp->processEvents(); } if (socket->state()==QAbstractSocket::ConnectedState) ... else ... примерно так, там уж сам пофантазируй дальше
Есть готовый метод https://doc.qt.io/qt-6/qabstractsocket.html#waitForConnected
socket->connectToHost(...); if(!socket->waitForConnected(20000)) // 20 секунд { qCritical() << "error connect:" << socket->error() << socket->errorString() << socket->state(); return false; } // connect ok ... return true
О, не увидел. Спасибо большое!
Обсуждают сегодня