4

私は次のコードを持っています:

 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)を開くと、上記のメソッドをアクティブ化したときにダイアログの内容が失われます。これらの問題を解決するにはどうすればよいですか?私はどこが間違っていますか?あいさつ

4

2 に答える 2

5
void processmethodONE()
{
   QThread* thread = new QThread;
   Prozess.moveToThread(thread);
   Prozess.start(ProcessComand);

ここで、QProcess を別のスレッドに移動しました。しかし、その上で start() を呼び出します。それはすでにスレッドセーフではありません。

while(!Prozess.waitForFinished(2000))
{
   std::cerr << "Process running " << std::endl;
}

これにより、スレッドの使用がブロックされ、役に立たなくなります。また、スレッドセーフではありません。

代わりにスレッドを使用しないでください。

  1. waitForFinished() 呼び出しを削除します
  2. QProcess の finished() および error() シグナルをスロットに接続し、次のステップ、つまり processMethodTWO を開始します。

また、QProcess オブジェクトを再利用することはお勧めしません。ステップごとに新しいオブジェクトを作成するだけです。

于 2012-03-25T19:24:00.110 に答える
3

最近更新されたコード例をまだ完全には理解していませんが、これが問題である可能性があると思います。

while(!Prozess.waitForFinished(2000))
   {
       std::cerr << "Process running " << std::endl;
   }

元のコードで実際にこれを呼び出しているところはどこでも、Prozess が終了するのを待っている間にブロックされています。

それぞれに新しい QProcess インスタンスを使用し、それらのfinished()シグナルを、終了時に呼び出される SLOT に接続します。それらを手動でポーリングしてブロックしないでください。これにより、QThreads を完全に取り除くことができます。

于 2012-03-25T19:16:47.600 に答える