要将你的 MaintestServerStartThread
函数改为非阻塞方式,可以利用 Qt 的信号和槽机制,而不是在循环中使用 waitForReadyRead()
。下面是一个示例,展示了如何实现这一点:
#include <QTcpSocket>
#include <QThread>
#include <QDebug>
class MaintestServer {
public:
void start() {
// 创建并设置socket
socket = new QTcpSocket();
connect(socket, &QTcpSocket::connected, this, &MaintestServer::onConnected);
connect(socket, &QTcpSocket::readyRead, this, &MaintestServer::onReadyRead);
connect(socket, &QTcpSocket::disconnected, this, &MaintestServer::onDisconnected);
// 连接到服务器
socket->connectToHost("127.0.0.1", 8809);
}
private slots:
void onConnected() {
qDebug() << "Connected to the server.";
}
void onReadyRead() {
QByteArray data = socket->readAll(); // 读取所有可用数据
int datasize = data.size();
tcpClient::getInstance()->processData(data); // 处理接收到的数据
}
void onDisconnected() {
qDebug() << "Disconnected from the server.";
// 断开连接后等待一段时间再进行重连,避免频繁重连导致资源浪费
QThread::sleep(5);
// 重连逻辑(可以根据需要进行修改)
socket->connectToHost("127.0.0.1", 8809);
}
private:
QTcpSocket *socket;
};
// 启动线程函数
DWORD WINAPI MaintestServerStartThread(LPVOID lpParam) {
MaintestServer server;
while (true) {
server.start();
// 使用事件循环来保持运行状态
QCoreApplication::exec();
// 在合适的时候退出主循环,例如通过某种条件判断或信号。
break;
}
return 0;
}
修改说明:
使用信号与槽:我们连接了
QTcpSocket
的多个信号(例如connected
,readyRead
, 和disconnected
)到相应的槽函数,这样当事件发生时会自动调用这些槽。去掉阻塞调用:不再使用
waitForReadyRead()
和其他阻塞调用,而是依赖于异步回调。保持应用运行:在启动 TCP 客户端后,我们进入一个事件循环 (
QCoreApplication::exec()
),这将使应用程序继续处理事件直到你显式退出这个循环。这也是标准的Qt方式来维持应用的运行状态。重连逻辑:如果断开连接,你可以选择在
onDisconnected
中实现重连逻辑。这里简单地添加了等待和重新连接。
确保在你的代码环境中创建并管理 Qt 应用程序对象,因为使用 Qt 的功能需要有效的事件循环上下文。
内容由零声教学AI助手提供,问题来源于学员提问