qt使用线程连接TCP时,未连接上一直发起连接申请直到连接成功,并且不造成线程阻塞
时间: 2024-12-17 22:39:24 浏览: 20
在Qt中,使用QThread和QTcpSocket来处理TCP连接时,如果你想创建一个异步非阻塞的连接尝试,可以采用信号槽机制结合`connect()`函数以及`QAbstractSocket::connectToHost()`和`QSocketNotifier`。
首先,你需要在一个单独的线程中创建`QTcpSocket`实例:
```cpp
QTcpSocket *tcpSocket = new QTcpSocket(this);
```
然后,你可以设置`QTcpSocket`为非阻塞模式:
```cpp
tcpSocket->setSocketOption(QAbstractSocket::LowDelay, true);
tcpSocket->setBlocking(false); // 设置为非阻塞模式
```
接下来,在`connectToHost()`方法中添加一个信号槽处理程序,当连接状态改变时会触发这个槽:
```cpp
QObject::connect(tcpSocket, &QTcpSocket::connected, this, []() {
qDebug() << "Connected to server";
});
QObject::connect(tcpSocket, &QTcpSocket::disconnected, this, []() {
qDebug() << "Disconnected from server";
});
tcpSocket->connectToHost(host, port);
```
最后,使用`QSocketNotifier`来监控连接状态变化,当连接成功或失败时,会自动通知你的应用程序:
```cpp
QSocketNotifier* notifier = new QSocketNotifier(tcpSocket->socketDescriptor(), QSocketNotifier::Connected | QSocketNotifier::Error, this);
notifier->setEnabled(true);
notifier->install();
```
这样,当连接到服务器时,如果尚未建立连接,`connectToHost()`不会阻塞线程,而是继续执行后续代码。一旦连接成功或发生错误,对应的信号会被发送并由`QSocketNotifier`通知你。
阅读全文