2017-05-19 8 views
1

OpenMPを使用して時間のかかる操作を実行しています。 ProgressBarをGTK +から、処理が実行されるのと同時に時間のかかるループ内から更新することができません。私はProgressBarを更新しているコードですが、すべてが完了した後に実行します。コードが進むにつれてではありません。C++のGTK + GUIは時間のかかる操作でどのように更新されますか?

これは、すべてが完了するまでプログレスバーを更新していない私のダミーのコードです:

void largeTimeConsumingFunction (GtkProgressBar** progressBar) { 

    int extensiveOperationSize = 1000000; 

    #pragma omp parallel for ordered schedule(dynamic) 
    for (int i = 0; i < extensiveOperationSize; i++) { 
     // Do something that will take a lot of of time with data 

     #pragma omp ordered 
     {   
      // Update the progress bar 
      gtk_progress_bar_set_fraction(*progressBar, i/(double)extensiveOperationSize); 
     } 

    } 
} 

私は同じことを行うが、OpenMPのを使用しなくても、同じことが起こるとき。それは最後まで更新されません。

ループが動作しているときに、どのようにGTK +ウィジェットを更新することができますか?

編集:これは短くて読みやすくするためのダミーコードです。それは私の実際のコードと同じ構造を持っていますが、私の実際のコードでは、私が処理するアイテムのサイズを手前に知りません。それは10個または100万以上のアイテムになる可能性があり、それぞれのために何らかのアクションを実行する必要があります。

+0

プログレスバーを単調に増加させたい場合は、GTK +の問題にかかわらず、ループの中で '#pragma omp critical'ではなく' #pragma omp ordered'を使うべきです!私は、パフォーマンスが低下する可能性があるため、注文しないことをおすすめしますが。 – Zulan

+0

チップをありがとう。私はそうそれを変えるでしょう。クリティカルは確かに秩序ある方法ではありませんが、私は疑問に思っています...私が既に上記の注文をしていれば、クリティカルが順番に実行されているのでしょうか?それとも、まだその重要な領域にランダムに入る1つのスレッドですか?簡単な言葉では、私が作った宣言された順序付けられた領域がその重要な領域もカバーしているかどうかわかりません。したがって、クリティカルにアクセスするスレッドは順番にあります。 –

+0

''並行順序付けされた ''は、 ''順序付けられた構造体なしで無意味です。 – Zulan

答えて

1

ここでは二つの潜在的な問題があります:あなたは、メインスレッドをブロックする可能性があります実行時間の長い計算を実行している場合

まず、あなたは(応答性のUIを維持するためにすべての今して

while (gtk_events_pending()) 
    gtk_main_iteration(); 

を呼び出す必要がありますこれには再描画が含まれます)。

第2に、call GTK+ functions only from main threadです。

+0

ありがとうございます。それは期待どおりに動作します。 –

関連する問題