c++ - QT 甚至在 waitForConnected 运行时进行处理

标签 c++ qt sockets event-handling

我有一个循环,应该尝试连接到范围内的每个 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 ,...您的QTcpSocketQEventLoop 的退出槽。这样,当套接字连接或发生错误时,本地事件循环将退出并执行其余部分:

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/

相关文章:

c- valgrind(无效的 free()/delete/delete[]/realloc())套接字

c++ - 为什么我不能从派生类中调用基类运算符?

c++ - C++ 中不可变对象(immutable对象)的可变容器

从 ubuntu 10.10 升级到 11.10 后的 c++ 编译错误

c++ - Qt5 WebKit 未检测到 NPAPI 插件

C++ 套接字 Send() 线程安全

c++ - `recv()` 会导致缓冲区溢出吗?

c++ - 在 sqlite3 数据库中搜索某些项目的查询

c++ - 将 int 分配给具有两个不同输出的 char

c++ - 带有 QDataStream 的 QByteArray 中的 char* 中的空字节