• 172阅读
  • 4回复

QT中TCP心跳机制中使用定时器的问题 [复制链接]

上一主题 下一主题
离线suzhuorui
 

只看楼主 倒序阅读 楼主  发表于: 02-10
在server端中添加心跳机制,15秒后无数据包时判断客户端状态为断开连接。
在clientthread.cpp中使用定时器时,在run函数中初始化了定时器,在槽函数中stop了定时器。但是会报QObject::killTimer: Timers cannot be stopped from another thread;原因是,run函数是属于子线程的,而槽函数不属于。但是要如何在槽函数中关闭定时器呢?错误处代码在最后面)



///clientthread.cpp





大佬们,怎么搞呀

离线suzhuorui

只看该作者 1楼 发表于: 02-10
离线liulin188

只看该作者 2楼 发表于: 02-10
既然是长连接,就单独开个线程维持心跳
https://wiki.qt.io/Qt_5.12_Release
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
离线fsu0413

只看该作者 3楼 发表于: 02-10
QThread对象本身不在QThread表示的线程里,只有run函数在子线程里跑
所以doheart是跑在Server所在线程里的,而m_timer在QThread所表示的线程里,导致报错

最好的解决方案:ClientThread不再继承QThread,改为继承QObject,run变为槽函数,并添加Signal started()
创建线程的代码改成下面这样

  1. ClientThread *clt = new ClientThread;
  2. QThread *th = new QThread(this);
  3. clt->moveToThread(th);
  4. connect(clt, &ClientThread::started, clt, &ClientThread::run, Qt::QueuedConnection);
  5. connect(th, &QThread::finished, clt, &ClientThread::deleteLater);
  6. th->start();
  7. emit clt->started();


run函数中所有创建的QObject子类都带上parent,这样可以在deleteLater时一并销毁

2条评分好评度+1威望+1
suzhuorui 好评度 +1 解决问题讲的比较详细 02-17
suzhuorui 威望 +1 解决问题讲的比较详细 02-17
离线fsu0413

只看该作者 4楼 发表于: 02-10
回 liulin188 的帖子
liulin188:既然是长连接,就单独开个线程维持心跳 (2020-02-10 17:12) 

维持心跳这么点事用不着线程dalao出手吧,没有阻塞的情况下也跑不了多长时间,有阻塞的话其他网络相关地方肯定也阻塞
快速回复
限100 字节
 
上一个 下一个