0

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

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

显然 QAudioOutput 必须有一个事件循环,因此该过程不会在播放声音之前结束,如果这是在主类中完成的,它将阻止一切。所以我知道线程会有所帮助。

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

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


更新

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

在以下位置找到了一个隐藏但很好的示例:https ://nachtimwald.com/2015/05/02/effective-threading-using-qt/

4

1 回答 1

1

你目前有...

startPlaying();
addWidgetandContainers();

问题在于,在播放完成之前startPlaying使用显式阻塞,QEventLoop从而延迟对addWidgetandContainers.

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

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

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

于 2018-01-07T15:10:13.477 回答