我正在使用OpenMP執行耗時的操作。我無法在執行操作的同時在耗時循環內從GTK +更新ProgressBar。我已經升級了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 + Widget在循環工作的同時更新?
編輯:這只是一個虛擬代碼,以保持它簡短易讀。它與我的實際代碼具有相同的結構,但在我實際的代碼中,我不知道將要處理的項目的大小。它可能是10個或100多萬個項目,我將不得不爲每個項目執行一些操作。
不管GTK +的問題,如果你想讓進度條單調增加,你應該在循環內使用'#pragma omp ordered'而不是'#pragma omp critical'!雖然我不會推薦訂購,因爲它可能會降低性能。 – Zulan
感謝您的提示。我會改變它。批評的確不是有序的,但我想知道......如果我已經有了上面的命令,那麼這是否意味着批判以有序的方式被執行?還是它仍然是一個隨機進入該關鍵區域的線程?用更簡單的話來說,我不知道我所宣稱的有序區域是否也覆蓋了這個關鍵區域,因此訪問關鍵區域的線程是按順序排列的。 –
沒有'ordered'構造的'parallel for ordered'是沒有意義的。 – Zulan