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万以上のアイテムになる可能性があり、それぞれのために何らかのアクションを実行する必要があります。
プログレスバーを単調に増加させたい場合は、GTK +の問題にかかわらず、ループの中で '#pragma omp critical'ではなく' #pragma omp ordered'を使うべきです!私は、パフォーマンスが低下する可能性があるため、注文しないことをおすすめしますが。 – Zulan
チップをありがとう。私はそうそれを変えるでしょう。クリティカルは確かに秩序ある方法ではありませんが、私は疑問に思っています...私が既に上記の注文をしていれば、クリティカルが順番に実行されているのでしょうか?それとも、まだその重要な領域にランダムに入る1つのスレッドですか?簡単な言葉では、私が作った宣言された順序付けられた領域がその重要な領域もカバーしているかどうかわかりません。したがって、クリティカルにアクセスするスレッドは順番にあります。 –
''並行順序付けされた ''は、 ''順序付けられた構造体なしで無意味です。 – Zulan