我有以下代码:
void Processmethod()
{
QDialog *ProcessMessage = new QDialog;
Ui::DialogProcessMessage Dialog;
Dialog.setupUi(ProcessMessage);
ProcessMessage->setModal(true);
ProcessMessage->setAttribute(Qt::WA_DeleteOnClose);
ProcessMessage->show();
qApp->processEvents();
processmethodONE();
processmethodTWO();
processmethodTHREE();
}
void processmethodONE()
{
QString ProcessCommand = "w8 " + blablubli";
Prozess.setWorkingDirectory(Path); //QProcess "Prozess" is globaly defined
Prozess.setStandardOutputFile(Path); //in my class
QThread* thread = new QThread;
Prozess.moveToThread(thread);
Prozess.start(ProcessCommand);
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
QProcess::ExitStatus Status = Prozess.exitStatus();
if (Status == 0)
{
std::cout << "File created!" << std::endl;
}
}
在这个源代码中,我尝试在某些进程启动之前打开一个弹出对话框。问题是该对话框不可点击,但在对话框中我想创建一个按钮来中止正在运行的方法。正如您所看到的,我尝试使用QThread在另一个线程中运行进程,但仍然无法单击该对话框。此外,如果我使用“application / x-executable”文件打开我的应用程序(GUI),则在激活上述方法时,对话框内容将丢失。我该如何解决这些问题?我哪里错了?问候
答案 0 :(得分:3)
void processmethodONE()
{
QThread* thread = new QThread;
Prozess.moveToThread(thread);
Prozess.start(ProcessComand);
在这里,您将QProcess移动到另一个线程。但是你在它上面调用start()。那已经不是线程安全了。
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
这阻止并使用线程无用。此外,它不是线程安全的。
你应该不使用线程,但是:
我还建议不要重复使用QProcess对象,只为每一步创建一个新对象。
答案 1 :(得分:2)
虽然我仍然不完全了解您最近更新的代码示例,但我觉得这可能是您的问题:
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
无论你在原始代码中用什么方式调用它,都会在等待Prozess完成时阻塞。
为每个实例使用一个全新的QProcess实例,并将它们的finished()信号连接到SLOT,这些SLOT将在完成时被调用。不要手动轮询它们并阻止它们。这将允许您完全摆脱QThreads。