2012-03-31 2 views
1

Ich versuche nur, eine Datei mit QProcess durch den folgenden Quellcode zu erstellen:QProcess ist nicht komplett Datei erstellen

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; 
    } 
} 

Dieser Prozess aus einer anderen Datei erstellt, die in der QString „Pfad“ ein neues befindet Datei, lass es mich "PROFIL" nennen (PRO für Problem :). Das Profil ist auch erstellt, aber nie abgeschlossen, ich denke, nicht einmal 50% der Datei sind abgeschlossen. Gerade bei der Verwendung wird

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

die Datei vollständig geschrieben. Desweiteren habe ich versucht das QProcess finished (int) Signal zu benutzen, um eine andere Methode zu starten und löschte die while-Schleife (welche die gesamte GUI einfriert). Ich erklärte es im Konstruktor mit:

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

Aber ich denke, das könnte nicht funktionieren, weil der erste Prozess nicht vollständig abgeschlossen ist. Wo ist das Problem?

+1

'... method' ... rubenvb

+0

"great" Kommentar Geck. wäre schön, wenn du mir nur sagen könntest, was du damit meinst? Das ist ein Forum! : P – Streight

+0

rufen Sie mich pedantisch und albern, aber 1) geben Funktionen einen Namen mit "Funktion" oder "Methode" in ihnen ist daft (obwohl für ein reines Beispiel hilft dies, um Ihre Nachricht zu vermitteln, also tun Sie es nicht in Wirklichkeit Lebenscode) und 2) "Methode" ist ein Java-ism. Nirgendwo im C- oder C++ - Standard wird dieser Begriff verwendet, und es macht mich schaudernd zu denken, dass ein Java-Programmierer versucht, C++ zu lernen. Nichts persönliches ';-)' – rubenvb

Antwort

2

Es gibt keine Garantie, dass direkt nach Prozess.start(ProcessCommand); Prozess beendet wird, also Aufruf "Prozess.exitStatus();" direkt danach wird es dir "falsch positiv" geben. Sie werden sicherlich warten müssen, bis der Prozess abgeschlossen ist. Sie können tun es entweder mit mit while-Schleife, dass Sie vorgeschlagen oder mit 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

Ich habe deinen Vorschlag ausprobiert, aber mit deinem Quellcode startet der QProcess "Prozess" nicht mehr ... – Streight

+0

habe vergessen, Prozess.start() vor loop.exec() hinzuzufügen. –

+0

Ich sehe nicht, wie dies ist anders als Aufruf von 'waitForFished()'. Sie beide blockieren. 'waitForFinished()' ist das Gleiche. – jdi