我有一个循环,应该尝试连接到范围内的每个 IP:
for(...){
socket->connectToHost(addres,port);
do stuff....
if(socket->waitForConnected(2000))
{
do stuff...
if(socket->waitForReadyRead(1000))
{
do stuff...
}
else do stuff...
}
do stuff ......
}
在连接尝试期间,UI 卡住,因为同时没有事件处理。我尝试添加 QCoreApplication::processEvents();在循环内部,但是在 waitForConnected 期间它仍然卡住很长时间,我也尝试使用计时器,但这也不起作用,因为 QT 需要事件处理才能首先使用计时器。有什么方法可以在连接期间提供事件处理(防止 UI 卡住),或者使用 waitForConnection 的一些非阻塞替代方案?
最佳答案
最好的方法是使用QTcpSocket
在异步模式下,通过将套接字的信号连接到相关插槽:
connect( socket, SIGNAL(connected()), this, SLOT(onConnected()) );
connect( socket, SIGNAL(readyRead()), this, SLOT(tcpReady()) );
connect( socket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(tcpError(QAbstractSocket::SocketError)) );
并在插槽中处理您的应用程序逻辑:
void MyClass::onConnected()
{
...
}
void MyClass::tcpError(QAbstractSocket::SocketError error)
{
...
}
您还可以使用 QEventLoop
来使用本地事件循环并连接信号connected
, error
,...您的QTcpSocket
到 QEventLoop
的退出槽。这样,当套接字连接或发生错误时,本地事件循环将退出并执行其余部分:
socket->connectToHost(addres,port);
QEventLoop loop;
loop.connect(socket, SIGNAL(connected()), SLOT(quit()));
loop.connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(quit()));
loop.exec();
//...
我不应该认为这是“阻塞等待而不阻塞 UI”的标准模式。
关于c++ - QT 甚至在 waitForConnected 运行时进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27787130/