2017-05-19 37 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

谢谢。它按预期工作。 –