标题:求助?线程接收Tcp数据问题
作者:alone_work
日期:2018-05-21 17:39
内容:
先感谢各位爱心人士帮忙参与讨论问题。
先介绍一下问题背景:
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:使用线程后关闭程序时最后会出现一个程序异常结束
// 关闭程序事件
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();
J ..
#1 [yanwuyue 05-22 13:12]
你的TCP连接必须在moveToThread以后才能初始化
#2 [zhaoyihuan 05-22 14:03]
根据你的需求,我觉得为啥不用redis的订阅/发布方式呢?简单好用,而且redis的实现也是tcp方式的。我接收数据(次/秒)就是使用的redis
#3 回 yanwuyue 的帖子 [alone_work 05-22 14:26]
yanwuyue:你的TCP连接必须在moveToThread以后才能初始化 (2018-05-22 13:12)
非常感谢,我试试这个方法
#4 回 zhaoyihuan 的帖子 [alone_work 05-22 14:29]
zhaoyihuan:根据你的需求,我觉得为啥不用redis的订阅/发布方式呢?简单好用,而且redis的实现也是tcp方式的。我接收数据(次/秒)就是使用的redis (2018-05-22 14:03)
之前只听说过Redis,没用过诶,主要还有一点,这个是嵌入式的!内存比较小。
有空研究一下Redis