我正在寻找澄清,以帮助我理解Qt 4.8的Qt多线程和事件循环。我还要补充一点,我一般是线程的新手,所以这是我问题的一部分。
我目前的情况是我有一个Qt应用程序,需要经常使用QTMultiMedia-QAudioOutput播放声音。我有两个类,MainGui和AudioWorker。我希望调用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()
或其他什么),那么我认为这应该按您的预期工作。