QProcess 没有完成创建文件

Posted

技术标签:

【中文标题】QProcess 没有完成创建文件【英文标题】:QProcess does not complete creating file 【发布时间】:2012-03-31 13:31:40 【问题描述】:

我只是想通过以下源代码使用 QProcess 创建一个文件:

void Processmethod()


    QDialog *ProcessMessage = new QDialog;      
    Ui::DialogProcessMessage Dialog;            
    Dialog.setupUi(ProcessMessage);             
    ProcessMessage->setModal(true);
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    ProcessMessage->show();

    processmethodONE(); 
 

void processmethodONE()

    QString ProcessCommand = "w8 " + blablubli";            

    Prozess.setWorkingDirectory(Path);         //QProcess "Prozess" is globaly defined  
    Prozess.setStandardOutputFile(Path);       //in my class
    Prozess.start(ProcessCommand);

    QProcess::ExitStatus Status = Prozess.exitStatus(); 

    if (Status == 0)
    
        std::cout << "File created!" << std::endl;
    

这个过程从位于QString“路径”中的另一个文件创建一个新文件,让我称之为“PROFILE”(PRO for Problem :)。配置文件也已创建,但从未完成,我猜甚至 50% 的文件都没有完成。 就在使用时

while(!Prozess.waitForFinished())
      
       qApp->processEvents();
       std::cerr << "Process Create PROFile running " << std::endl;
      

文件已完全写入。 此外,我尝试使用 QProcess finished(int) 信号来启动另一个方法并删除了 while 循环(它冻结了整个 GUI)。我在构造函数中声明了它:

connect(&Prozess, SIGNAL(finished(int)), this, (SLOT(processmethodTWO())));

但我猜这行不通,因为第一个过程还没有完全完成。问题出在哪里?

【问题讨论】:

“伟大的”评论老兄。如果你能告诉我你的意思会很好吗?这是一个论坛! :P 称我为迂腐和愚蠢,但是 1) 给函数起一个带有“函数”或“方法”的名称是愚蠢的(尽管对于一个纯粹的例子,这有助于传达你的信息,所以不要t 在现实生活中的代码中执行此操作)和 2)“方法”是 Java 主义。在 C 或 C++ 标准中没有任何地方使用过这个术语,想到 Java 程序员正在尝试学习 C++ 让我不寒而栗。没什么私人的;-) 1) 是的,我这样做是为了举例,因为我不是真正的专业程序员,我这样做只是为了让它更清楚,但显然每个优秀的程序员都会首先看到这是一种方法看法 :)。 2)是的,没错,我从 Java 开始,因此想到了“方法”这个名字,但是当我是对的时候,我也看过/阅读了一些德国 c++ 教程,他们使用了“方法”这个名字,并告诉“函数”是更多的数学符号(如 intz = x+y)。 ;) 【参考方案1】:

不保证Prozess.start(ProcessCommand); 进程将立即完成,因此调用“Prozess.exitStatus();”之后它会给你“误报”。您当然必须等到过程完成。您可以使用您建议的 while 循环或使用 QEventLoop 来执行此操作

// ...
Prozess.setStandardOutputFile(Path);       //in my class
QEventLoop loop;
connect(&Prozess, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
connect(&Prozess, SIGNAL(finished(int, QProcess::ExitStatus)), &loop, SLOT(quit()));
Prozess.start();
loop.exec();
// Now your process status should be valid:
QProcess::ExitStatus Status = Prozess.exitStatus();

【讨论】:

我尝试了您的建议,但包括您的源代码,QProcess“Prozess”不再启动... 忘记在 loop.exec() 之前添加 Prozess.start()。 我看不出这与致电 waitForFinished () 有何不同。他们都挡住了。 waitForFinished() 是一回事。 但它进行 gui 处理。我可以清楚地看到您以与我不同的方式理解“gui阻塞”。被阻止的 gui 不响应用户交互。使用 QEventLoop,你可以让你的 gui 像往常一样工作 我知道你现在用它做什么了。我只是从未见过使用过这种模式(同一线程中的嵌套事件循环)。据我了解,将 QProcess 信号连接到将触发下一个动作的插槽更合适,而不是坐在嵌套循环中等待,除非您要过滤掉该事件循环中的用户事件并使其动作就像一个模态对话框。

以上是关于QProcess 没有完成创建文件的主要内容,如果未能解决你的问题,请参考以下文章

QProcess::setStandardOutputFile 只创建 0kb 文件

QProcess 执行一个 c++ 文件

QT Creator QProcess

在 Qt QProcess 中运行 sudo 命令

如果程序完成,QProcess exe 不会关闭

QProcess 无法执行简单的控制台程序