如何用耗时的操作更新C ++中的GTK + GUI?

时间:2017-05-19 02:46:07

标签: c++ user-interface openmp gtk3

我正在使用OpenMP执行耗时的操作。我无法在执行操作的同时从耗时循环内更新GTK +中的ProgressBar。我已经更新了ProgressBar的代码,但是在完成所有操作后它都会这样做。而不是代码的进展。

这是我的虚拟代码,在完成所有操作之前不会更新ProgressBar:

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万个项目,我将不得不为每个项目执行一些操作。

1 个答案:

答案 0 :(得分:1)

这里有两个潜在的问题:

首先,如果您正在执行可能阻止主线程的长时间运行计算,则必须调用

while (gtk_events_pending ())
  gtk_main_iteration ();

时不时地保持UI响应(包括重绘自身)。

其次,你应该call GTK+ functions only from main thread