2012-03-31 60 views
1

我只是想通過下面的源代碼創建QProcess中一個文件: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的「路徑」的另一個文件的新文件,讓我稱之爲「配置文件」(PRO for Problem :)。配置文件也被創建,但從來沒有完成,我想即使文件的50%都沒有完成。 正當使用

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

該文件被完全寫入。 此外,我試圖使用QProcess完成(int)信號啓動另一種方法,並刪除while循環(凍結整個GUI)。我在構造函數中聲明:

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

但我想這不能工作,因爲第一個進程沒有完全完成。哪裏有問題?

+1

'... ... method' rubenvb 2012-03-31 14:28:39

+0

「偉大」的評論花花公子。如果你能告訴我你的意思是什麼,會不會很好?這是一個論壇! :P – Streight 2012-04-01 13:54:26

+0

叫我迂腐和愚蠢的,但1)給函數一個名稱與「功能」或「方法」在他們是愚蠢的(雖然對於一個純粹的例子,這有助於傳達你的信息,所以只是不要做到真正的生活代碼)和2)「方法」是一個Java-ISM。 C或C++標準中沒有其他地方使用過這個術語,它讓我不寒而慄,認爲Java程序員正在嘗試學習C++。沒有個人的';-)' – rubenvb 2012-04-01 14:52:30

回答

2

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(); 
+0

我試過你的提議,但包括你的源代碼QProcess「Prozess」不再啓動了...... – Streight 2012-03-31 14:48:40

+0

忘記在loop.exec()之前添加Prozess.start()。 – 2012-03-31 20:10:14

+0

我不明白這和調用'waitForFinished()'有什麼不同。他們都阻止。 'waitForFinished()'是同樣的事情。 – jdi 2012-03-31 20:17:52