我正在寻求澄清,以帮助我理解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()
或其他),我认为这应该按预期工作。