2016-05-20 9 views
0

- 私は(notepad.exeのようなので、上の例で異なるプログラム用)テキストファイルから複数のQProcessesを開始し、彼らはまだ実行されている場合は、定期的にチェックしたいです。QTチェックQProcess状態を定期的

AがUIスレッドがブロックされているので、ループは、溶液をisn'tつつ。 これはどのように達成できますか?ジャワ(アンドロイド)で、私はScheduldExecutorServiceに接続asynctask でこれを行うだろう。 qtに似たようなものがありますか?私は私のプロセスを開始するところ

これは、次のとおりです。

void mywidget::startprocesses(QString &text) 
{ 
    QProcess *process = new QProcess(this); 
    this->myprocess.append(process); 
    process->start(text); 
    int state = process->state(); 
    addlabelstatus(state); 
} 

そしてここでメソッドが呼び出されます。

while(!stream->atEnd())         //check stream until empty and assign line as a caption to a new QLabel 
     { 
      this->fileread = stream->readLine(); 
      if(!this->fileread.isEmpty()) 
      { 
       central->addlabel(this->fileread); 
       central->startprocesses(this->fileread); 
      } 
     } 






void mywidget::addlabelstatus(QProcess::ProcessState newstate) 
{ 
    QString sstring; 

    if(newstate == 0) 
    { 
     QString sstring = "Wird nicht ausgeführt"; 
     QLabel *label = new QLabel(sstring); 
     this->processstatus.append(label); 
     this->vrarea->addWidget(label); 
    } 
    else if (newstate == 1) 
    { 
     QString sstring = "Wird gestartet!"; 
     QLabel *label = new QLabel(sstring); 
     this->processstatus.append(label); 
     this->vrarea->addWidget(label); 
    } 
    else if (newstate == 2) 
    { 
     QString sstring = "Wird ausgeführt!"; 
     QLabel *label = new QLabel(sstring); 
     this->processstatus.append(label); 
     this->vrarea->addWidget(label); 
    } 
    else 
    { 
     QString sstring = "kein Status vorhanden!"; 
     QLabel *label = new QLabel(sstring); 
     this->processstatus.append(label); 
     this->vrarea->addWidget(label); 
    } 
} 
+1

http://doc.qt.io/qt-4.8/qtconcurrentrun.html? – zoska

答えて

4

QProcessは、いくつかのプロセスが終了または変更(タイプによって)されたときに放出されるfinished(int exitCode, QProcess::ExitStatus exitStatus)およびstateChanged(QProcess::ProcessState newState)シグナルを持ちます。だからあなたのコードは次のようになります

.H側:

public slots: 
    void processFinished(int exitCode, QProcess::ExitStatus exitStatus); 
    void addlabelstatus(QProcess::ProcessState newState); 

.CPP側:あなたはこれを試すことができCOMMENT質問

FOR

void mywidget::processFinished(int exitCode, QProcess::ExitStatus exitStatus) 
{ 
    <...> 
} 

void mywidget::addlabelstatus(QProcess::ProcessState newState) 
{ 
    switch(newState) { 
     <...> 
    }; 
} 

// Your code change 

QProcess *process = new QProcess(this); 
this->myprocess.append(process); 
connect(process, &QProcess::finished, this, &mywidget::processFinished); 
connect(process, &QProcess::stateChanged, this, &mywidget::addlabelstatus); 
process->start(text); 

UPDATE way:

.H側

public slots: 
    void processFinished(QLabel *label, int exitCode, QProcess::ExitStatus exitStatus); 
    void addlabelstatus(QLabel *label, QProcess::ProcessState newState); 

.CPP側

void mywidget::processFinished(QLabel *label, int exitCode, QProcess::ExitStatus exitStatus) 
{ 
    <...> 
} 

void mywidget::addlabelstatus(QLabel *label, QProcess::ProcessState newState) 
{ 
    switch(newState) { 
     <...> 
    }; 
} 

while(!stream->atEnd()) { 
      this->fileread = stream->readLine(); 
      if(!this->fileread.isEmpty()) { 
       QLabel *label = new QLabel(this->fileread); 
       QProcess *process = new QProcess(this); 
       this->myprocess.append(process); 

       connect(process, &QProcess::finished, [=] 
       (int exitCode, QProcess::ExitStatus exitStatus) 
       { processFinished(label, exitCode, exitStatus); }); 

       connect(process, &QProcess::stateChanged, [=] 
       (QProcess::ProcessState newState) 
       { addlabelstatus(label, newState); }); 

       process->start(text); 
      } 
} 
+0

非常に良い。私はaddlabelstatusで、プロセスの記述を動的に含むQLabelを作成します。したがって、プロセスが更新されるたびに、新しいラベルが作成されます。ステータス更新のたびに動的に追加されたQlabelを削除するにはどうすればよいですか?私は私の最初のスレッドでaddlabelstatusメソッドを追加しました – Patrick260284

+0

しかし、なぜそうするのですか?一度に1つの 'QLabel'を作成し、オブジェクト名やポインタなどで更新します。 – someoneinthebox

+0

私はテキストファイルからプロセスを読みました。ですから、最初に作成されたプロセスがいくつあるのか分かりません。 – Patrick260284

2

Aそれは、UIをブロックしているので、ループは、解決策をisn'tしながら、 -糸。

正しいです。 @someoneintheboxは答えとして、それが発生したときに通知するように各QProcessのstateChanged信号に接続し、それに反応し、その代わりに

// Assuming we have a list of processes QList<QProcess*> called timerList 

QTimer* pTimer = new QTimer; 
connect(pTimer, &QTimer::timeout, [=](){ 

    foreach(QProcess* proc, timerList) 
    { 
     // get state 
     int state = process->state(); 
     // update UI 
     addlabelstatus(state);    
    } 

}); 

pTimer->start(1000); // every second 

または - :Qtはイベント駆動型のフレームワークであるため、しかし、あなたはタイマーを使用することができます。

関連する問題