查看完整版本: [-- 关于QTsocket多线程中跨线程发送问题 --]

QTCN开发网 -> Qt基础编程 -> 关于QTsocket多线程中跨线程发送问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

wangzihan082 2020-09-15 11:44

关于QTsocket多线程中跨线程发送问题

由于项目需要,做了一个QT的TCP服务端,想要实现如下功能:
1、每个客户端连接时,在重写的incomingConnection函数中,为每一个客户端创建一个线程;
2、每个客户端有数据发送上来时,在线程中进行分析,处理后自动返回,并通过信号通知主进程客户端信息;
3、在主进程UI界面中,选择客户端进行发送;


目前1和2都已经可以实现,第3还没有什么思路,在网上又说道用QMetaObject::invokeMethod这个方法,请教各位大神,这个方法如何使用?
除了这种方法外,还有没有其他可行的方案,谢谢

fsu0413 2020-09-15 12:34
在线程中再做一个类继承qobject,然后用这个类做普通的发送就行
然后这个类里自产自销一对signalslot,然后要发送的时候直接调signal

青空飞羽 2020-09-15 13:38
每个客户端应该需要一个唯一标识,当有客户端连接上来时,用一个map保存每一个客户端对应连接的socket。主进程UI界面中,选择客户端进行发送时,找到对应客户端连接的socket,然后往这个socket写数据

wangzihan082 2020-09-15 13:54
青空飞羽:每个客户端应该需要一个唯一标识,当有客户端连接上来时,用一个map保存每一个客户端对应连接的socket。主进程UI界面中,选择客户端进行发送时,找到对应客户端连接的socket,然后往这个socket写数据 (2020-09-15 13:38) 

谢谢,这个方法在单线程中操作没有问题,当每一个SOCKET在线程中时,就会报跨线程错误。

青空飞羽 2020-09-15 15:44
wangzihan082:谢谢,这个方法在单线程中操作没有问题,当每一个SOCKET在线程中时,就会报跨线程错误。 (2020-09-15 13:54) 

那可以用信号槽的方式,主进程UI界面中消息发送信号和每一个客户端线程对象的消息接收槽绑定,消息发送信号中带入客户端唯一标识,和发送数据,消息接收槽中根据客户端唯一标识判断是否是自己发送该条数据

wangzihan082 2020-09-15 16:53
青空飞羽:那可以用信号槽的方式,主进程UI界面中消息发送信号和每一个客户端线程对象的消息接收槽绑定,消息发送信号中带入客户端唯一标识,和发送数据,消息接收槽中根据客户端唯一标识判断是否是自己发送该条数据 (2020-09-15 15:44) 

嗯,目前正在做这方面的尝试,谢谢。

fanjunchao 2021-06-29 20:45
楼主第三个解决了吗,我也在思考这三个问题,能不能就第二、三个问题给些思路啊


查看完整版本: [-- 关于QTsocket多线程中跨线程发送问题 --] [-- top --]



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