如何用C++更新GTK + GUI,耗时的操作?
问题描述:
我正在使用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多万个项目,我将不得不为每个项目执行一些操作。
答
这里有两个潜在的问题:
首先,如果你正在执行长时间运行的计算可能会阻止主线程,你必须调用
while (gtk_events_pending())
gtk_main_iteration();
飘飞保持UI响应(其中包括重绘本身)。
+0
谢谢。它按预期工作。 –
不管GTK +的问题,如果你想让进度条单调增加,你应该在循环内使用'#pragma omp ordered'而不是'#pragma omp critical'!虽然我不会推荐订购,因为它可能会降低性能。 – Zulan
感谢您的提示。我会改变它。批评的确不是有序的,但我想知道......如果我已经有了上面的命令,那么这是否意味着批判以有序的方式被执行?还是它仍然是一个随机进入该关键区域的线程?用更简单的话来说,我不知道我所宣称的有序区域是否也覆盖了这个关键区域,因此访问关键区域的线程是按顺序排列的。 –
没有'ordered'构造的'parallel for ordered'是没有意义的。 – Zulan