2017-05-03 28 views
0

我正在为搅拌机制作渲染作业管理器。我有一个构建渲染作业队列的类,然后单击“开始”,然后开始逐个渲染一个循环。我的问题是waitForFinished()方法阻止了我的整个程序。但我读过你不应该使用QThreadQProcess这是QProcess和QProcess一起使用的合适时机吗?

这是循环的工作原理。

do{   
if(myProcess->state() == QProcess::NotRunning) { 

      myProcess->setProgram(blenderPath); 
      myProcess->setArguments(arguments); 
      myProcess->start(); 
      myProcess->waitForFinished(-1); 

      //Get rid of current rendering job to prepare for the next job 
      renderQueueList.pop_front(); 
     } 

     }while(renderQueueList.empty() != true); 

我可以使用一个单独的线程来启动QProcess,那么最好的方法是什么?我读过你对QThread进行抽象或者使用信号和插槽,但是它很混乱,特别是当我需要将参数传递给进程时。

谢谢。

编辑: 我想补充说,进程必须在运行新进程之前完成。它必须按顺序进行。这就是为什么我认为我需要这个过程在自己的线程中运行。

+1

为什么不直接听'finished()'信号呢? – MrEricSir

+0

@MrEricSir你是对的....这是一篇文章http://www.qtcentre.org/threads/26067-Article-How-to-QProcess-in-QThread – Naidu

+0

我很困惑。文章展示了如何在新的主题中创建一个流程,但评论者说这是不好的。这是什么? – LetTheWritersWrite

回答

1

QProcess已经以不同的进程执行,即与应用程序异步执行。

当您调用waitForFinished()时,应用程序将锁定,直到QProcess中的进程结束。您需要连接到finished()和可能的errorOccured()信号,然后当QProcess在后台运行时,您的应用程序将继续运行。

您需要将该循环更改为检查队列是否为空,并在完成的()信号上启动新进程。

如果您运行一个运行QProcesses并执行waitForFinished()的QThread,您将确实释放主应用程序线程,但当QProcess已经异步并且您已完成()以通知您它何时无需锁定线程,无论是UI线程还是单独的线程。

+0

中有一个很好的例子,我需要访问进程的'finished()'信号。我刚刚意识到'QProcess :: NotRunning'甚至没有在我的代码中工作。我在某处读到我可以做到这一点,但这是完全错误的。所以你建议做一个递归连接,在每次完成后开始我的函数,并且在我的函数中,我将只有一个if语句来检查QList是否为空。你能帮我建立联系吗?我无法理解这些文档在说什么。它们使用lambda表达式,甚至没有指定是否需要创建一个对象或任何用于建立连接的对象。 – LetTheWritersWrite

+0

我想出了如何创建连接,并将上面的代码作为插槽并递归调用。工作完美!我摆脱了'do while'循环,并用if语句替换它,在再次启动该过程之前检查renderQueueList是否为空。非常感谢! – LetTheWritersWrite