2017-07-17 8 views
1

アルゴリズムを実行するのに多くの時間を消費するアプリケーションがあります。フィルタが実行されているとき、アルゴリズムが終了するまで、GUIは明らかにブロックされます。Qtビジー処理ダイアログ

そのため、アルゴリズムが実行されている間にモーダルダイアログを表示して、「ビジー」メッセージを表示します。この方法では、GUIは依然として応答性があります。次のように私はそれをやってみました:

dialog->setModal(true); 
dialog->show(); 

// Run the code that takes up a lot of time 
.... 

dialog->close(); 

しかし、この方法では、ダイアログが表示されますが、それはすべての黒(それが描かれていない)、鍬は、私はこの問題を解決することができますか?

+3

あなたのコードでは、最も可能性の高いイベントループ処理をブロックしています。別の実行スレッドに移動します。 – StoryTeller

答えて

3

GUIが応答しなければならない場合、重いアルゴリズムは非メイン(非GUI)スレッドで実行する必要があります。 応答するには、GUIがイベントループでイベントを処理するためにメインスレッドにアクセスする必要があります。

QFutureQtConcurrent::runを使用してこれを実装できます。 QFuture利用

例:コメントで

TAlgoResult HeavyAlgorithm() {/* Here is algorithm routine */}; 
QFuture<TAlgoResult> RunHeavyAlgorithmAsync() 
{ 
    QtConcurrent::run([&](){return HeavyAlgorithm();}); 
} 

// class which calls algo 
class AlgoCaller 
{ 
    QFutureWatcher<TAlgoResult> m_future_watcher; 
    QDialog*     mp_modal_dialog; 

    AlgoCaller() 
    { 
     QObject::connect(&m_future_watcher, &QFutureWatcher<void>::finished, 
     [&]() 
     { 
      mp_modal_dialog->close(); // close dialog when calculation finished 
     }) 
    } 

    void CallAlgo() // to be called from main thread 
    { 
     mp_modal_dialog->show(); // show dialog before algo start 
     m_future_watcher.setFuture(RunHeavyAlgorithmAsync()); 
      // start algo in background 

     // main thread is not blocked and events can be processed 
    } 

}; 
+0

例を挙げることはできますか? – manatttta

+0

@ manattttaが提供されています。あなたが助けてくれるかどうか調べてみてください –

+0

'close'メソッドはスレッドセーフではないので、別のスレッドから呼び出すことはできません! –

関連する問題