理解Qt多线程和事件循环

时间:2018-01-07 12:01:31

标签: multithreading qt qthread qeventloop

我正在寻求澄清,以帮助我理解Qt 4.8的Qt多线程和事件循环。我还想补充一点,我是一般新的线程,这是我问题的一部分。

我目前的情况是我有一个Qt应用,需要经常使用QTMultiMedia-QAudioOutput播放声音。我有两个课程, MainGui AudioWorker 。我希望将AudioWorker称为" play()"经常发声。

显然QAudioOutput必须有事件循环,因此在播放声音之前进程不会结束,如果在主类中完成,它将保持一切。所以我理解线程会有所帮助。

现在,如果我理解正确的线程,那么衍生线程的生存时间不能超过创建它的函数,除非它以某种方式分离?因此,如果我在MainGui类中收到通知以播放声音,并且我通过插槽连接生成一个新线程,该连接在AudioWorker中调用play(),那么一旦我的MainGui通知功能结束,带有事件循环的线程就不会消失吗?如果是这样的话,那么MainGui是否需要事件循环?

当然我错过了什么?我是否需要以某种方式分离线程?我在Qt文档中没有看到很多关于分离的内容。整个过程似乎过分只是为了播放一个简单的声音。

更新

通过在play()函数中创建QThread解决了问题。在发出信号之前,线程不会过早退出。

找到了一个隐藏但很好的例子:https://nachtimwald.com/2015/05/02/effective-threading-using-qt/

1 个答案:

答案 0 :(得分:1)

你目前有......

startPlaying();
addWidgetandContainers();

问题是startPlaying会阻止显式QEventLoop,直到播放完成,从而延迟对addWidgetandContainers的调用。

由于您已将QAudioOutput::stateChangedfinishedPlaying广告位相关联,因此您只需从startPlaying中删除以下代码...

QEventLoop loop;
do {
  loop.exec();
} while(audioOutput->state() == QAudio::ActiveState);

只要您的主GUI线程启动其事件循环(QApplication::exec()或其他),我认为它应该按预期工作。