当前位置: 代码迷 >> QT开发 >> Qt线程间通信的Qt:DirectConnection疑问解决办法
  详细解决方案

Qt线程间通信的Qt:DirectConnection疑问解决办法

热度:114   发布时间:2016-04-25 04:50:28.0
Qt线程间通信的Qt::DirectConnection疑问
最近在捣腾Qt的多线程,在线程间通信这一块有点疑问,一般而言,使用全局变量或者消息机制来进行线程间通信,这里,得益于Qt的signal/slot机制,我使用使用了信号来通信。

先说一下我对基本概念的理解,从操作系统的角度去看,任一时刻,只能有一个线程在运行,基于这个观点,引出了我的问题。

我有两个线程,线程A和线程B,当A处于运行态的时候,B处于等待态,现在,我在A的运行过程中,想给B传递一些数据,我使用了Qt::DirectConnection来把A的signal连接到B的slot上,而Qt::DirectConnection的说明是直接跳到slot函数去执行slot的代码。现在的问题是,A处于运行态,B处于等待态,并且slot函数属于B线程的,通过Qt::DirectConnection怎么能够跑去执行B线程的代码呢?因为B还在等待,还没轮到B执行,难道是,操作系统先把A挂起,然后唤醒B,接着跑去执行B的slot函数?还是什么机制,因为无论如何,AB是不可能同时处于运行态的,这个Qt::DirectConnection是如何保证B的slot能够马上执行,并且保证代码安全的(而不是一个非法的强制跳转)执行呢?

基于这个问题,我还引出了另外一个问题,如果使用消息机制进行通信,线程A给线程B发送消息只能使用postEvent不能使用sendEvent,postEvent把消息放入B的消息队列中,然后A继续执行,当B运行时,就从消息队列中取出消息进行处理,这样才安全,而sendEvent是马上跑到B的消息处理函数中去处理这个消息,处理完毕后才返回,然后A继续执行,但是这个问题同开始的问题一样,当调用sendEvent时,A处于运行态,B处于等待态,要处理这个消息,必须强制从A跳到B去执行代码,这不是非法的了吗?如果B线程没有唤醒,怎么能够执行B的消息处理函数呢?而B要运行则A必然要挂起,这里就很乱了,难道操作系统会先挂起A,然后唤醒B,B处理完后,又挂起B,再唤醒回A,A从sendEvent返回处开始继续执行。

上面的问题可以简单的概括为,如何在线程外面对线程进行控制,就好比是,在B线程外面(A线程里),对B进行控制,因为一旦处在线程B外面,就表明其他线程(A)在运行态,而本身B线程在挂起,而B没有进入运行态的话,怎么控制得了它的执行序列呢?非常困惑,请教论坛里的大神门了

------解决方案--------------------
基本概念错了。
假定你有两个线程 TA 和 TB,
TA、TB 内分别创建了对象 A、B

然后你在TB内调用A的成员函数,就是调用一个普通函数而已,此时和线程TA没什么关系,代码在TB内执行。

如果
  相关解决方案