跨线程使用socket的问题

cdpcsc 2016-01-21 09:47:06
看到有人说QTcpSocket不能跨线程使用(没在文档上看到这样的描述)但我遇到的问题是可以跨线程读数据,却不能写数据,如下:
void ReciveWorker::readPendingDatagrams()
{
qDebug() << "ReciveWorker thread id:" << QThread::currentThreadId();
QByteArray by = Conn->socket()->readAll();
qDebug() << "ReciveWorker recive data:" << by;
Conn->socket()->write(by);
}

主线程创建的socket,在worker线程中read没问题,write时失败,并输出一行错误信息;QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

本来还有一个线程单独负责在这个socket上write,发现不能发送数据。结果发现在可以read的线程里也不能write。这是什么道理?
...全文
2124 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
千荒 2016-08-24
  • 打赏
  • 举报
回复
引用 4 楼 pulller 的回复:
[quote=引用 2 楼 zsmd000 的回复:] worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
如果有多个子线程同时发送信号给主线程的话,主线程会阻塞住,直接挂掉。[/quote] 很久没登录了,如果是多个任务的话应该使用生产者消费者模型,将待发送的数据放到队列中(全局数据,通常是一个静态成员List),同时唤醒中间线程线程逐一读取List,中间线程按照队列发送信号给主线程(即之前的 emit sendData(data);)。
caiwei_cs 2016-06-27
  • 打赏
  • 举报
回复
应该是socket类不是线程安全的吧??你可以查一下资料
caiwei_cs 2016-06-27
  • 打赏
  • 举报
回复
用信号与槽或者invokemethod,他说不能自然是有原因的。
sichuanwww 2016-06-26
  • 打赏
  • 举报
回复
xunxunmimizhong 2016-06-18
  • 打赏
  • 举报
回复
引用 2 楼 zsmd000 的回复:
worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
如果有多个子线程同时发送信号给主线程的话,主线程会阻塞住,直接挂掉。
xunxunmimizhong 2016-06-18
  • 打赏
  • 举报
回复
引用 2 楼 zsmd000 的回复:
worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
这个方法不错,今天刚好遇到这个问题。
千荒 2016-01-26
  • 打赏
  • 举报
回复
worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
itsmypink 2016-01-22
  • 打赏
  • 举报
回复
我也碰到了楼主一样的问题,跨线程的tcpsocket发送不了信息,也是报同样的错误。 但我没试过读信息
内容概要:本文研究了基于粒子群优化算法(PSO)的抽水蓄能电站最佳调度方案,旨在通过智能优化算法解决电站运行中的多约束、多目标调度问题。文中深入分析了抽水蓄能电站的运行特性与核心调度约束,构建了兼顾经济性、系统稳定性与电网调峰能力的多目标优化体系,并针对传统调度方法在全局寻优与动态响应方面的不足,提出采用粒子群优化算法进行高效求解。研究通过Matlab仿真平台完成了算法建模与调度逻辑的设计与实现,仿真结果表明,该方法能有效提升调度效率、降低运行成本,并显著增强电力系统对可再生能源的消纳能力和调峰灵活性。; 适合人群:具备电力系统、运筹学或自动化等相关领域基础知识,同时拥有一定Matlab编程与仿真实践能力的研究生、科研人员以及从事能源系统优化、电力调度工作的工程技术人员。; 使用场景及目标:①应用于抽水蓄能电站的日度或短期优化调度,实现发电与抽水计划的科学制定,提升能源利用效率与经济效益;②为新型电力系统中储能资源的智能调度提供先进的算法支持与可靠的仿真验证方案;③作为智能优化算法在能源电力领域应用的典型教学与科研案例,深化对元启发式算法求解复杂工程问题的理解。; 阅读建议:建议读者结合提供的Matlab代码,深入理解粒子群优化算法在电力调度问题中的具体实现流程,重点关注目标函数的数学建模、多重约束条件的处理技巧以及算法关键参数的调优策略,并可通过修改负荷预测曲线、调整电站参数或引入新的优化目标等方式,进一步拓展仿真场景,深化研究。

21,503

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧