理解Qt多线程和事件循环

问题描述 投票:0回答:1

我正在寻求澄清,以帮助我理解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/

multithreading qt qthread qeventloop
1个回答
1
投票

你现在有......

startPlaying();
addWidgetandContainers();

问题是startPlaying阻止了明确的QEventLoop直到比赛结束,从而延迟了对addWidgetandContainers的召唤。

由于您已经将QAudioOutput::stateChanged连接到finishedPlaying插槽,您可以简单地从startPlaying中删除以下代码...

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

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

© www.soinside.com 2019 - 2024. All rights reserved.