• 8710阅读
  • 6回复

[提问]跨线程使用对象的错误问题 [复制链接]

上一主题 下一主题
离线houtinghua
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-04

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x849ba8), parent's thread is thClientEntity(0x84e058), current thread is QThread(0x844258)

我主线程用了子线程生成的tcpsocket对象就出现上面的话,按理说出了上面的错误提示,为什么依然成功执行了发送操作呢?  

再问下, 调用子线程的tcpsocket对象read方法没问题,为什么调用write反而出上面的问题啊,  按说应该只要用了就会报错啊
离线dbzhang800

只看该作者 1楼 发表于: 2014-05-04
QTcpSocket 不是线程安全的。你在哪一个线程内创建的socket对象,你就只能在同一个线程内调用它的read/write和其他函数,而后通过线程间通讯传递数据。

离线liulin188

只看该作者 2楼 发表于: 2014-05-04
楼上说的对
QSerialPort类也是
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线houtinghua

只看该作者 3楼 发表于: 2014-05-04
回 dbzhang800 的帖子
dbzhang800:QTcpSocket 不是线程安全的。你在哪一个线程内创建的socket对象,你就只能在同一个线程内调用它的read/write和其他函数,而后通过线程间通讯传递数据。
 (2014-05-04 16:44) 

也就是说,这段话是警告,如果线程不乱,执行结果是没有问题的对吧?

第二个问题没有回答 谢谢
离线dbzhang800

只看该作者 4楼 发表于: 2014-05-04
1. 这是错误。说明你创建QTcpSocket的线程 和 你调用read/write的线程不一致。

2. QTcpSocket 线程不安全,只要你不解决1中问题,什么事情都可以发生。
离线houtinghua

只看该作者 5楼 发表于: 2014-05-05
回 dbzhang800 的帖子
dbzhang800:1. 这是错误。说明你创建QTcpSocket的线程 和 你调用read/write的线程不一致。
2. QTcpSocket 线程不安全,只要你不解决1中问题,什么事情都可以发生。 (2014-05-04 17:19) 

1  read/write是在一个线程内做的,而且是在同一个方法,  只是我把read/write都用外部的一个静态函数去执行了
离线dbzhang800

只看该作者 6楼 发表于: 2014-05-05
回 houtinghua 的帖子
houtinghua:
1  read/write是在一个线程内做的,而且是在同一个方法,


首先,QThread看似很简单,事实却是,绝大部分用户都不能正确使用它的。所以,没有代码,很难判断你说的是不是对的。
另外,由于Qt中事件系统、queue方式信号槽、moveToThread()等东西的存在,往往会使得用户非常困惑,无法理解下面这段话:

简单的说,就像main是进程和主线程的入口函数一样,QThread::run() 是次线程的入口函数,你要保证,你的QTcpSocket的创建,read/write 函数的调用,都在同一个 run() 函数的内部。


快速回复
限100 字节
 
上一个 下一个