Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 理解Qt多线程和事件循环_Multithreading_Qt_Qthread_Qeventloop - Fatal编程技术网

Multithreading 理解Qt多线程和事件循环

Multithreading 理解Qt多线程和事件循环,multithreading,qt,qthread,qeventloop,Multithreading,Qt,Qthread,Qeventloop,我正在寻求澄清,以帮助我理解Qt4.8中的Qt多线程和事件循环。我还想补充一点,一般来说,我是线程新手,所以这是我问题的一部分 我目前的情况是,我有一个Qt应用程序,需要经常使用QTMultiMedia-QAudioOutput播放声音。我有两门课,MainGui和AudioWorker。我想经常打电话给AudioWorker来“play()”一个声音 显然,QAudioOutput必须有一个事件循环,这样这个过程不会在声音播放之前结束,如果这是在主类中完成的,它将保留所有内容。所以我知道线程会

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

我目前的情况是,我有一个Qt应用程序,需要经常使用QTMultiMedia-QAudioOutput播放声音。我有两门课,MainGuiAudioWorker。我想经常打电话给AudioWorker来“play()”一个声音

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

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

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


更新

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

找到了一个隐藏但很好的示例:

您当前拥有

startPlaying();
addWidgetandContainers();
问题是
startPlaying
使用显式
QEventLoop
阻塞,直到播放完成,从而延迟了对
addWidgetandContainers
的调用

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

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

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

我认为您可能误解了
Qt
文档中的一些注释
QAudioOutput
确实需要一个活动的事件循环来运行,但它不需要在专用线程上有自己的事件循环。嗯,那么也许我的代码错了?我目前正在循环声音播放30次,而gui开始播放每个循环2秒长的音频剪辑。此过程当前阻止在播放声音时加载我的小部件。你是说我可以用另一种方法解决这个问题吗?你需要显示你的代码。@G.M.我已经发布了我的代码。真的很累,希望我没有错过anything@JavaBeast如果找到答案,则发布步骤并添加答案的必要代码,不要删除生成错误的代码,因为这会使您的问题在社区中无法使用。如果我删除建议我的声音播放一次的代码,并且在stateChanged中输入的最后一个状态是ActiveState。HCI从未打开,但代码从未出错。我猜想,因为事件处理在函数结束时提前终止因此,过早退出会使我的代码处于错误状态。感谢您的帮助,我解决了QThread的问题。我从问题中删除了代码,因为我认为它和未来的观众无关,这个问题更倾向于理解理论,而不是我的具体代码。不幸的是,这样会降低你的回答,为此道歉。