了解Qt多线程和事件循环



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

我目前的情况是我有一个Qt应用程序,需要经常使用QTMultiMedia-QAudioOutput播放声音。我有两个类,MainGuiAudioWorker。我希望调用AudioWorker 来经常"播放()"声音。

显然,QAudioOutput 必须有一个事件循环,这样这个过程就不会在播放声音之前结束,如果这是在主类中完成的,它将保留所有内容。所以我知道线程会有所帮助。

现在,如果我正确理解线程,生成的线程的寿命不能超过创建它的函数,除非它以某种方式分离?因此,如果我在我的 MainGui 类中收到播放声音的通知,并且我通过插槽连接生成一个新线程,该线程在 AudioWorker 中调用 play(),那么一旦我的 MainGui 通知函数结束,带有事件循环的线程不会死亡吗?如果是这种情况,那么无论哪种方式,MainGui 都需要事件循环,这有什么意义呢?

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


更新

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

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

您目前有...

startPlaying();
addWidgetandContainers();

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

由于您已经将QAudioOutput::stateChanged连接到finishedPlaying插槽,因此您可能只需从startPlaying中删除以下代码即可...

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

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

最新更新