2011-01-28 6 views
1

グリーティングすべて、OpenMPループ内でQApplication :: processEvents()を呼び出す?

私のQTアプリケーションでは、私はループを並列化するためにOpenMPを使用します。ループでは、現在のQMainWindowのプログレスバー値を更新したいと思います。コードスニペット後 が、私はこれを行うにしようとしています方法を示しています。

#ifdef OPENMP_ENABLE 
#pragma omp parallel for 
#endif 

for (int i = 0; i < endIndex; i++) { 
    getMainWindow()->setProgress(currProg); //change the value of QProgressBar 
QApplication::processEvents(); //update events,widgets 

        //Do some processing 
} 

ここをgetMainWindow() - >でsetProgress()メソッドは、単純にQMainWindowのステータスバーに取り付けたQProgressbarの値を変更します。 OpenMPのではQApplication ::のprocessEvents()を呼び出す方法を

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 161975a0. Receiver 'MainWindowClass' (of type 'MainWindow') was created in thread 13d78f8", file kernel\qcoreapplication.cpp, line 348

任意のヒント:コンパイルとのOpenMPを使用してアプリケーションを実行するには有効にすると

、それは次のエラーを与えますか?

ありがとうございます。

答えて

2

サブクラスQThreadでビジネスロジックをそこに置き、そこでOpenMPを使用します。信号とスロットを使用してQProgressBarを更新します。

メインGUIスレッドでのみGUIメソッドを呼び出すことができます。 OpenMPスレッド内でQApplication :: processEventsを呼び出してこのルールを外します。

0

私は次のようにも動作するはずと仮定します。

#pragma omp parrallel for 
for (int i = 0; i < endIndex; i++) 
{ 
    #pragma omp single 
    { 
    getMainWindow()->setProgress(currProg); //change the value of QProgressBar 
    QApplication::processEvents(); //update events,widgets 
    } 
    // Do some processing 
} 
+0

はそれを試して得た: エラーC3034:OpenMPの「一」ディレクティブは、直接指示 –

+0

'(OMP_GET_THREAD_NUM(もし「の並列」内にネストすることはできません)== 0) 'の代わりに' single 'ディレクティブを使用することもできます。しかし、それは非常にきれいではありません。 –