如何使用耗时的操作更新 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 响应(包括重绘本身)。
其次,你应该。
我正在使用 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 响应(包括重绘本身)。
其次,你应该