c - GtkSpinner 具有持久的功能与 C

标签 c gtk gtk3

我正在用 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/

相关文章:

python - Gtk+ FlowBox 选择不起作用

c - 如何在单个窗口中显示gtk中的文本和按钮?

python - 在 GTK 应用程序中包含控制台应用程序

c - GDK3/GTK3 窗口更新的精确计时

Python GTK+ 3 : How to make a button circular?

c - 如何在 gtk3 中获得事件的 gtk 窗口?

c - C 中的符号扩展,char>unsigned char

c - 输出中存在字符的说明

c# - 从 C# 调用 C# : How to marshall that one 2D array of doubles when the others go so well?

c - 有没有办法检测是否按下了某个键?