1

次のソースコードで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:)。プロファイルも作成されますが、完成することはありません。ファイルの 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())));

しかし、最初のプロセスが完全に終了していないため、これはうまくいかなかったと思います。問題はどこだ?

4

1 に答える 1

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();
于 2012-03-31T13:45:23.060 に答える