c++ - 现在是将 QThread 与 QProcess 结合使用的合适时机吗?

标签 c++ qt qthread qprocess

我正在为 blender 制作渲染作业管理器。我有一个类构建了一个渲染作业队列,然后您单击“开始”,它开始使用循环一次渲染一个。我的问题是 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 进行了抽象或使用了信号和槽,但这太令人困惑了,特别是当我需要将参数传递给进程时。

谢谢。

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

最佳答案

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

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

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

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

关于c++ - 现在是将 QThread 与 QProcess 结合使用的合适时机吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766559/

相关文章:

c++ - 在C++中调用重写的方法后得到错误的输出

c++ - 从 QWidget 中的 QTextEdit 获取文本

c++ - Qt C++ C2143 : syntax error : missing ';' before '*'

c++ - 我应该在线程上调用 processEvents() 吗?

c++ - 什么类型的字符串最适合用于 Win32 和 DirectX?

c++ - 如何使用boost库读写.ini文件

c++ - :-1: error: LNK1104: cannot open file 'MyProject.obj'

python - 将数据传递到 Python GUI 中的 QThread

c++ - Qt QThread 使用信号/插槽从工作人员到 gui 的问题

c++ - VC++ libcurl .lib 大小