【发布时间】:2012-04-09 09:24:34
【问题描述】:
我有以下代码:
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),则在激活上述方法时会丢失对话框内容。我该如何解决这些问题?我哪里错了?问候
【问题讨论】:
-
我有几个问题... 1) 你怎么打电话给
Processmethod()? 2) 为什么你觉得你需要创建一个 QThread 并将 QProcess 移入其中?还有,你为什么不启动新的 QThread? 3) 你是否为你所有的processmethodX()使用这个全局QProcess? -
它不适合这个问题,但我建议你用 lowerCamelCase 编写变量名称。它的可读性非常快。不过我同意 jdi,需要更多信息才能回答。
-
通常不需要在线程中运行 QProcess,因为它的 API 不会阻塞,除非您使用 waitForStarted/Finished 方法。
-
@FrankOsterfeld:我敢打赌,一旦 OP 为我们提供了我的问题的答案,很明显这里有额外的问题(你在线程中不需要 QProcess 是正确的)跨度>
-
1) 当单击按钮时,我调用 Processmethod()。 2)我认为在另一个线程中运行该进程会使对话框可点击/可用。你是对的,我没有启动 QThread - 我的错 - 我是否必须创建一个连接方法并将线程连接到我定义进程的方法? 3.每个进程都有一个 QProcess - 再次使用相同的会更好吗?我很抱歉我的错误,但我在理解 QThread 方法时遇到了问题,可能是因为我的英语不够好。 @Frank:正如你现在所看到的,我使用 waitForFinished - 编辑了我的问题。
标签: c++ qt qthread qprocess qdialog