查看完整版本: [-- 求助?线程接收Tcp数据问题 --]

QTCN开发网 -> Qt基础编程 -> 求助?线程接收Tcp数据问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

alone_work 2018-05-21 17:39

求助?线程接收Tcp数据问题

先感谢各位爱心人士帮忙参与讨论问题。
先介绍一下问题背景:
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. // 关闭程序事件
    void PortableCollector::closeEvent(QCloseEvent *e)
    {
        if(RcvCmd) { // 发送命令类
            RcvCmd->CloseScoket();
            RcvCmd->deleteLater();;
            RcvCmd = NULL;
        }
        if(Data) { // 接收数据线程
            Data->CloseScoket();
            Data->deleteLater();
            Data = NULL;
        }
        if(ParseDT) { // 解析数据线程
            ParseDT->deleteLater();
            ParseDT = NULL;
        }
        if(JThread) { // 线程池
            JThread->exit();
            JThread->wait();
            JThread->deleteLater();
            JThread = NULL;
        }
    }



yanwuyue 2018-05-22 13:12
你的TCP连接必须在moveToThread以后才能初始化

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

alone_work 2018-05-22 14:26
yanwuyue:你的TCP连接必须在moveToThread以后才能初始化 (2018-05-22 13:12) 

非常感谢,我试试这个方法

alone_work 2018-05-22 14:29
zhaoyihuan:根据你的需求,我觉得为啥不用redis的订阅/发布方式呢?简单好用,而且redis的实现也是tcp方式的。我接收数据(次/秒)就是使用的redis (2018-05-22 14:03) 

之前只听说过Redis,没用过诶,主要还有一点,这个是嵌入式的!内存比较小。
有空研究一下Redis


查看完整版本: [-- 求助?线程接收Tcp数据问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled