我正在用 C 语言制作 GTK+3 应用程序,我想要一个微调器来显示程序何时处理数据。这是我通常拥有的:
main()
{
//Some statements
g_signal_connect(G_OBJECT(btnGenerate), "clicked", G_CALLBACK(Generate), &mainform);
}
void Generate(GtkWidget *btnGenerate, form_widgets *p_main_form)
{
gtk_spinner_start(GTK_SPINNER(p_main_form->spnProcessing));
Begin_Lengthy_Processing(Parameters, Galore, ...);
//gtk_spinner_stop(GTK_SPINNER(p_main_form->spnProcessing));
}
我已注释掉停止函数,因此即使在函数完成后我也可以看到旋转器旋转,但旋转器在函数完成后启动,我怀疑它在主函数中打开循环。
我还发现,在执行长时间运行的函数时,整个界面都会卡住。
有没有办法让它在回调函数中启动并显示?我发现了同样的问题,但它使用Python和线程。这是 C,而不是 Python,所以我认为情况有所不同。
最佳答案
您需要在单独的线程中运行冗长的计算,或者将其分成 block 并在主线程中作为空闲回调单独运行每个 block 。
如果您的冗长计算需要一组输入,并且在完成之前不需要更多输入,那么您应该将其构造为 GTask
并使用g_task_run_in_thread()
开始任务。其结果将通过 GTask 的 GAsyncReadyCallback 传回主线程。有一个例子here .
如果在进行过程中需要更多输入,您可能需要使用 GAsyncQueue
为其提供更多输入,以及 GThreadPool
提供线程(通过多次调用冗长的函数来分摊创建线程的成本,并防止拒绝服务)。
GNOME 开发人员文档给出了 overview of how to do threading .
关于c - GtkSpinner 具有持久的功能与 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42565518/