• 5644阅读
  • 8回复

多线程数据共享 [复制链接]

上一主题 下一主题
 

只看楼主 倒序阅读 楼主  发表于: 2015-08-07

[backcolor=rgba(255, 255, 255, 0)]我写了一个tcp服务器类,它继承自qthread,然后再服务器类里创建了一个监听套接字,一个链接套接字,同时我在服务器类里启动了一个数据接收线程,一个数据发送线程,这两个线程也都是继承自qthread的类,因为数据接收和数据发送线程都要用到链接套接字,所以我就把链接套接字所在的服务器类的this传给了数据接收和数据发送线程。
[backcolor=rgba(255, 255, 255, 0)]问题时运行程序时报cannot create children for a parent that is in a different thread;Qsocketnotifier:socket notifier cannot be disableed from another thread。
[backcolor=rgba(255, 255, 255, 0)]求大神们解答啊
离线realfan

只看该作者 1楼 发表于: 2015-08-07
继承自QThread的类,其实例不一定就属于thread线程
如果没有movetothread的话,这个对象实例应该还是主线程的

只看该作者 2楼 发表于: 2015-08-08
回 realfan 的帖子
realfan:继承自QThread的类,其实例不一定就属于thread线程
如果没有movetothread的话,这个对象实例应该还是主线程的 (2015-08-07 08:04) 

你提到的这个对象实例是我上边提到的this指针吗?我还是没明白报的这个错是因为哪的问题?该如何修改?
离线realfan

只看该作者 3楼 发表于: 2015-08-08
回 菜鸟学编程 的帖子
菜鸟学编程:你提到的这个对象实例是我上边提到的this指针吗?我还是没明白报的这个错是因为哪的问题?该如何修改? (2015-08-08 08:35) 

是在主线程调用了子线程对象的函数,函数运行在主线程中。但函数中又有创建子对象的行为,就会引起这个错误。
可以考虑用信号的方式代替函数调用
离线tylan

只看该作者 4楼 发表于: 2015-08-08
依据楼主的做法,假如监听过程运行在线程A中,接收数据的过程在线程B中,发送数据的过程在线程C中,楼主是否想过,你的tcp服务类属于主线程而不属于线程A,你讲this传入线程B和C,如果在B和C那么多个线程中同时访问了这个对象,可能会出现死锁的状况。Qt为了避免这种明显的错误,所以让你在编译器就通不过。
离线tylan

只看该作者 5楼 发表于: 2015-08-08
qt是事件驱动的,楼主完全没有必要去用一个线程专门接收数据,用一个线程专门发送数据。当然你要是练手闹着玩另说哈。用qt本身的事件驱动模型个人认为会更有效。顺便说一下,个人认为能用不到万不得已不用多线程。

只看该作者 6楼 发表于: 2015-08-09
回 realfan 的帖子
realfan:是在主线程调用了子线程对象的函数,函数运行在主线程中。但函数中又有创建子对象的行为,就会引起这个错误。
可以考虑用信号的方式代替函数调用 (2015-08-08 22:02) 

您好,但函数中又有创建子对象的行为这句话是什么意思?求解释
离线realfan

只看该作者 7楼 发表于: 2015-08-09
我没有看过qt代码,我只把我的理解说一下,不确定是对的。
比如对象Obj,有一个方法fun,
void XXX::fun()
{
    XX * p = new Obj2(this);
}

Obj属于某子线程,fun里面,创建了以该对象为父的对象。
如果在主线程中直接调用了fun,则fun是运行在主线程,而在里面,给这个子线程中的对象创建了一个子对象。在qt中是不允许的。
离线zjxsw

只看该作者 8楼 发表于: 2015-08-28
1.要在服务器线程中的run()函数中new另外两个线程;
2.线程之间不要直接调用函数,使用信号槽。
努力奋斗吧,少年
快速回复
限100 字节
 
上一个 下一个