• 2835阅读
  • 4回复

[提问]求助?线程接收Tcp数据问题 [复制链接]

上一主题 下一主题
离线alone_work
 

只看楼主 倒序阅读 楼主  发表于: 2018-05-21
先感谢各位爱心人士帮忙参与讨论问题
先介绍一下问题背景:
1. 项目是使用Qt使用Tcp网络接受数据,而且是实时接收数据,每秒钟接收一次,数据还有点多;
2. 想使用线程中来接收数据,使用的时候是用moveToThread的方法使用线程;
3. 主线程中使用两个TCP端口,一个是发送命令,一个接收数据端口;
为题1:发送命令端口封装在一个类中,不能使用moveToThread到线程中,使用就会出现以下错误

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
QSocketNotifier: Invalid socket 14 and type 'Read', disabling...
问题2:将发送命令端口放在主线程中运行,将接收数据端口moveToThread到线程中去,可以使用,但是关闭时出现以下错误
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
程序异常结束。
问题3:使用线程后关闭程序时最后会出现一个程序异常结束

  1. // 关闭程序事件
  2. void PortableCollector::closeEvent(QCloseEvent *e)
  3. {
  4.     if(RcvCmd) { // 发送命令类
  5.         RcvCmd->CloseScoket();
  6.         RcvCmd->deleteLater();;
  7.         RcvCmd = NULL;
  8.     }
  9.     if(Data) { // 接收数据线程
  10.         Data->CloseScoket();
  11.         Data->deleteLater();
  12.         Data = NULL;
  13.     }
  14.     if(ParseDT) { // 解析数据线程
  15.         ParseDT->deleteLater();
  16.         ParseDT = NULL;
  17.     }
  18.     if(JThread) { // 线程池
  19.         JThread->exit();
  20.         JThread->wait();
  21.         JThread->deleteLater();
  22.         JThread = NULL;
  23.     }
  24. }


离线yanwuyue

只看该作者 1楼 发表于: 2018-05-22
你的TCP连接必须在moveToThread以后才能初始化
离线zhaoyihuan

只看该作者 2楼 发表于: 2018-05-22
根据你的需求,我觉得为啥不用redis的订阅/发布方式呢?简单好用,而且redis的实现也是tcp方式的。我接收数据(次/秒)就是使用的redis
离线alone_work

只看该作者 3楼 发表于: 2018-05-22
回 yanwuyue 的帖子
yanwuyue:你的TCP连接必须在moveToThread以后才能初始化 (2018-05-22 13:12) 

非常感谢,我试试这个方法
离线alone_work

只看该作者 4楼 发表于: 2018-05-22
回 zhaoyihuan 的帖子
zhaoyihuan:根据你的需求,我觉得为啥不用redis的订阅/发布方式呢?简单好用,而且redis的实现也是tcp方式的。我接收数据(次/秒)就是使用的redis (2018-05-22 14:03) 

之前只听说过Redis,没用过诶,主要还有一点,这个是嵌入式的!内存比较小。
有空研究一下Redis
快速回复
限100 字节
 
上一个 下一个