我是linux的开发者,近期弄了软件做调试使用的,困在了QThread的使用上了,看文档的介绍,QThread从run函数开始,相当于调用pthread_create()的回调函数形成了一个独立的线程,但我想实现tcp客户端的一个线程用来读,一个线程用来写,一个线程需要重连机制,但是死活没弄明白如何使用。
看了大量的文章,说可以使用moveToThread函数来解决这个问题,例子是不少,八成都是大家相互抄写,最后写的实例除了类名不同,内容都类似的,无法解决使用问题,而且基本演示都不重载run,只是演示了线程id不在主线程。
希望有位资深的Qt开发同仁来指点一下如何用多线程的方式来解决tcp网络通讯的问题 ,万分感谢。
创建3个线程,1个线程发送,一个线程接收,一个线程监控链接是否断开(管理重连);
首先发送线程这个没什么说的,connect成功后,在run函数中写直接用send函数发送就是了。(当然,connect你也可以放在线程中去做)。监控线程需要跟发送线程和接收线程通信(用信号槽),因为如果你在监控线程中直接使用发送套接字或者接收套接字,就需要做线程同步,容易出问题。不如采用如下方式处理:当发送线程发送失败后,给监控线程发信号,监控线程再去处理;同理,接收线程一样的方式。下面主要说一下接收线程:
接收数据有两种方式,一种是客户端向服务端发建立connect后,服务端使用这个建立的套接字给客户端发送数据。这种也没什么说的,跟发送线程一样,connect以后,在run函数中接收数据就是了。
第二种是客户端接收数据的方式是:服务端主动向客户端建立连接(服务端主动),这时候,你的客户端软件其实就是一个tcp的服务端。
@qfl_sdu 其实更明确一点的事 就是 重连线程要做connectToHost()这个事, 读线程需要使用read()这个事 ,写线程需要使用write()这个事。问题是如何让这个QTcpSocket 分别在这三个线程中共同使用 ,就这个问题很让人困扰。
可能我没太理解你的意思,能否简单的写个run的示例??