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

How does one update the GTK+ GUI in C++ with time consuming operations?

我正在使用 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+ 小部件在循环工作的同时进行更新?

编辑:这只是一个虚拟代码,以使其简短易读。它与我的实际代码具有相同的结构,但在我的实际代码中,我事先并不知道我将要处理的项目的大小。它可能是 10 个或超过 100 万个项目,我将不得不对每个项目执行一些操作。

这里有两个潜在的问题:

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

while (gtk_events_pending ())
  gtk_main_iteration ();

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

其次,你应该