QT开发中文网

DWORD WINAPI MaintestServerStartThread(LPVOID lpParam) { // MainWindow *app = reinterpret_cast(lpParam); while (true) { QTcpSocket *socket = tcpClient::getInstance()->GetTcpSocket(); socket->connectToHost("127....

要将你的 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;
}

修改说明:

  1. 使用信号与槽:我们连接了 QTcpSocket 的多个信号(例如 connected, readyRead, 和 disconnected)到相应的槽函数,这样当事件发生时会自动调用这些槽。

  2. 去掉阻塞调用:不再使用 waitForReadyRead() 和其他阻塞调用,而是依赖于异步回调。

  3. 保持应用运行:在启动 TCP 客户端后,我们进入一个事件循环 (QCoreApplication::exec()),这将使应用程序继续处理事件直到你显式退出这个循环。这也是标准的Qt方式来维持应用的运行状态。

  4. 重连逻辑:如果断开连接,你可以选择在 onDisconnected 中实现重连逻辑。这里简单地添加了等待和重新连接。

确保在你的代码环境中创建并管理 Qt 应用程序对象,因为使用 Qt 的功能需要有效的事件循环上下文。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=12913

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?