gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:15:03 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com