ZBLOG

#include #include #include #include #include #include #include #include #include #include #include #include ...

在Qt中,QSocketNotifier应该在创建它的线程中被启用和禁用。由于你在不同的线程中使用QTcpSocket,这会导致出现QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread的错误。

要解决这个问题,你可以将QTcpSocket对象放在主线程中,并通过信号与槽机制与其他线程进行通信。下面是一个修正的示例:

#include <QApplication>
#include <QTcpSocket>
#include <QThread>
#include <QDebug>
#include "tcpclient.h"
#include "mainwindow.h"

class MaintestServerStartThread : public QThread
{
public:
    void run() override {
        TcpClient::getInstance()->Start();
    }
};

class ThreadClientHeartbeatStart : public QThread
{
public:
    void run() override {
        while (true) {
            QTcpSocket *socket = TcpClient::getInstance()->GetTcpSocket();
            if (socket->state() == QAbstractSocket::ConnectedState) {
                // Socket 连接正常
                TcpClient::getInstance()->SendHeartbeat();
            }
            Sleep(1000);
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    TcpClient::getInstance(); // Initialize the TCP client instance

    QString strIp = argc > 1 ? argv[1] : "127.0.0.1";
    
    MainWindow w;
    w.show();

    // Start server thread
    MaintestServerStartThread* serverStarter = new MaintestServerStartThread();
    serverStarter->start();

    // Start heartbeat thread
    ThreadClientHeartbeatStart* heartbeatChecker = new ThreadClientHeartbeatStart();
    heartbeatChecker->start();

    return a.exec();
}

注意事项:

  1. QObject 的子类:如果你的 TcpClient 类是 QObject 的子类,请确保它只能由创建它的线程访问。

  2. 信号与槽:保持信号与槽机制,以便主线程可以接收到从网络层发送过来的数据或心跳信息。如果需要跨线程操作,可以使用 Qt 的 signal/slot 机制来处理。

  3. 多线程中的 QObject:如果你要在多个线程间共享某些 QObject 实例,最好避免直接调用其方法,而是通过信号和槽来触发相应的行为。

以上修改确保了所有 socket 操作都在同一个线程中进行,从而避免了您遇到的问题。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?