我正在使用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万个项目,我将不得不为每个项目执行一些操作。
答案 0 :(得分:1)
这里有两个潜在的问题:
首先,如果您正在执行可能阻止主线程的长时间运行计算,则必须调用
while (gtk_events_pending ())
gtk_main_iteration ();
时不时地保持UI响应(包括重绘自身)。