• 7140阅读
  • 2回复

主线程连接服务器子线程发送数据失败的原因 [复制链接]

上一主题 下一主题
离线sbtree
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-12
— 本帖被 XChinux 执行加亮操作(2010-09-04) —
一个对话框或者QApplication的事件循环往往都是通过调用exec函数来启动的,exec函数实际上是堵塞的,也就是说如果窗口不关闭,程序就会一直处在该函数中,而其他窗口是得不到响应的,一个模态对话框通常就是以这种方式运行的。
在一个Qt线程中同样存在这样一个函数exec,这意味着,一个线程也可以启动事件循环,对事件进行处理。而如何让线程run函数一直运行(无终止的循环),同时又能够响应该线程的消息,通常的做法是在run函数的循环中调用QApplication::proccessEvents函数,而不是呼叫exec函数,否则run循环和事件循环无法兼顾。

我现在有这样一个问题,我把主线程中的一个对象指针传递给了子线程,希望子线程对该对象的操作能而产生的信号能传达到主线程中,也就是信号将会夸线程,该对象包含QTcpSocket和QSocketNotifier对象,这个对象在主线程中连接到服务器,但是我在子线程中却无法发送数据到到服务器,而在主线程中发送是没有问题的。我现在考虑的是,QTcpSocket为什么不能垮线程操作,或者如果想实现跨线程操作,该做什么?当然了,我可以在子线程中创建对象并连接服务器,而成功完成数据发送的功能。而我这里是想了解一下真相,或许还有其他的解决方法,还望各位指点
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 1楼 发表于: 2010-08-12
在没有别的办法之前,我只好把创建连接对象和连接到服务器的过程转移到了子线程中了,可是现在还是有问题,当我断开连接的时候,也就是调用tcpSocket->disconnectFromHost()函数的时候,出现了一个这样的错误,见图片
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 2楼 发表于: 2010-08-12
引用第1楼sbtree于2010-08-12 20:22发表的  :
在没有别的办法之前,我只好把创建连接对象和连接到服务器的过程转移到了子线程中了,可是现在还是有问题,当我断开连接的时候,也就是调用tcpSocket->disconnectFromHost()函数的时候,出现了一个这样的错误,见图片
[图片]  

这个问题终于想通了,原来我建立的槽是在QThread的对象中,当我接收到finished信号的时候,虽然QThread对象还在,但是线程已经不存在了,这样的话槽函数将是在创建QThread对象的线程中运行的,所以出现了跨线程调用的问题。但是怎么解决呢?还在探索中。。。
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个