小白的梦想 2021-09-11 21:18 采纳率: 11.1%
浏览 12

关于QT的线程使用问题

我是linux的开发者,近期弄了软件做调试使用的,困在了QThread的使用上了,看文档的介绍,QThread从run函数开始,相当于调用pthread_create()的回调函数形成了一个独立的线程,但我想实现tcp客户端的一个线程用来读,一个线程用来写,一个线程需要重连机制,但是死活没弄明白如何使用。

看了大量的文章,说可以使用moveToThread函数来解决这个问题,例子是不少,八成都是大家相互抄写,最后写的实例除了类名不同,内容都类似的,无法解决使用问题,而且基本演示都不重载run,只是演示了线程id不在主线程。

希望有位资深的Qt开发同仁来指点一下如何用多线程的方式来解决tcp网络通讯的问题 ,万分感谢。

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2021-09-11 22:14
    关注

    创建3个线程,1个线程发送,一个线程接收,一个线程监控链接是否断开(管理重连);
    首先发送线程这个没什么说的,connect成功后,在run函数中写直接用send函数发送就是了。(当然,connect你也可以放在线程中去做)。监控线程需要跟发送线程和接收线程通信(用信号槽),因为如果你在监控线程中直接使用发送套接字或者接收套接字,就需要做线程同步,容易出问题。不如采用如下方式处理:当发送线程发送失败后,给监控线程发信号,监控线程再去处理;同理,接收线程一样的方式。下面主要说一下接收线程:
    接收数据有两种方式,一种是客户端向服务端发建立connect后,服务端使用这个建立的套接字给客户端发送数据。这种也没什么说的,跟发送线程一样,connect以后,在run函数中接收数据就是了。
    第二种是客户端接收数据的方式是:服务端主动向客户端建立连接(服务端主动),这时候,你的客户端软件其实就是一个tcp的服务端。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月11日

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿