这是QThread与QProcess一起使用的适当时机吗?

时间:2017-05-03 17:30:52

标签: c++ qt qthread qprocess

我正在为搅拌机做一个渲染工作经理。我有一个类,它构建一个渲染作业队列,然后单击开始,它开始一个循环渲染一个。我的问题是waitForFinished()方法支撑了我的整个程序。但我已经读过你不应该将QThreadQProcess一起使用。

这就是循环的工作原理。

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 个答案:

答案 0 :(得分:3)

QProcess已在不同的进程中执行,即与您的应用程序异步。

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

您需要将该循环更改为检查队列是否为空并且在finish()信号上开始新进程。

如果你运行一个运行QProcesses并执行waitForFinished()的QThread,你确实会释放主应用程序线程,但是当QProcess已经异步并且你已经完成()让你知道它何时完成时它是一个毫无意义的额外层无需锁定线程,无论是UI线程还是单独的线程。