2017-05-19 36 views
1

我正在使用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多萬個項目,我將不得不爲每個項目執行一些操作。

+0

不管GTK +的問題,如果你想讓進度條單調增加,你應該在循環內使用'#pragma omp ordered'而不是'#pragma omp critical'!雖然我不會推薦訂購,因爲它可能會降低性能。 – Zulan

+0

感謝您的提示。我會改變它。批評的確不是有序的,但我想知道......如果我已經有了上面的命令,那麼這是否意味着批判以有序的方式被執行?還是它仍然是一個隨機進入該關鍵區域的線程?用更簡單的話來說,我不知道我所宣稱的有序區域是否也覆蓋了這個關鍵區域,因此訪問關鍵區域的線程是按順序排列的。 –

+0

沒有'ordered'構造的'parallel for ordered'是沒有意義的。 – Zulan

回答

1

這裏有兩個潛在的問題:

首先,如果你正在執行長時間運行的計算可能會阻止主線程,你必須調用

while (gtk_events_pending()) 
    gtk_main_iteration(); 

飄飛保持UI響應(其中包括重繪本身)。

二,您應該call GTK+ functions only from main thread

+0

謝謝。它按預期工作。 –