C-GTK3和螺纹
我用C编写了一个程序来测试动态GTK标签更改,但该程序在经过一些迭代后会立即停止更新GUI 在调用gtk_main()之前,直接使用PThreads API创建一个新线程,我认为这是正确的方法,因为gtk参考手册说gdk_threads_*函数已被弃用,并且没有建议任何替代方法 这是新创建的线程的过程和入口点。 它只是随着迭代次数的增加而压缩一个常量字符串,并将其设置为标签,但不知何故,在不可预测的迭代次数停止更新之后C-GTK3和螺纹,c,multithreading,gtk3,C,Multithreading,Gtk3,我用C编写了一个程序来测试动态GTK标签更改,但该程序在经过一些迭代后会立即停止更新GUI 在调用gtk_main()之前,直接使用PThreads API创建一个新线程,我认为这是正确的方法,因为gtk参考手册说gdk_threads_*函数已被弃用,并且没有建议任何替代方法 这是新创建的线程的过程和入口点。 它只是随着迭代次数的增加而压缩一个常量字符串,并将其设置为标签,但不知何故,在不可预测的迭代次数停止更新之后 void * change_text(void * args) {
void * change_text(void * args)
{
char * initialText = (char *) malloc(strlen(gtk_label_get_text((GtkLabel *) args)) * sizeof(char));
strcpy(initialText, gtk_label_get_text((GtkLabel *) args));
char setnew[512];
int x = 1;
while(1) {
printf("%s\n", initialText);
sprintf(setnew, "%s %d", initialText, x++);
gtk_label_set_text(GTK_LABEL(args), setnew);
sleep(1);
bzero(setnew, 512);
}
}
线程没有崩溃
有人能帮我动态更新标签、按钮等的正确方法吗。。。在GTK3?中,问题是您希望在另一个线程中更新GUI。这不是一个好主意。在构建GUI应用程序时,您应该做什么(这不是GTK+特定的):
- 在主线程中更新GUI,也称为GUI线程
- 在后台线程中执行重载,然后通知GUI
pthreads
的IPC机制,您可以使用g_idle\u add((GSourceFunc)yourfunc,NULL);在线程内部运行func。在此链接中,所有代码:
为了正确起见,您更愿意使用本机gtk函数,即我的示例中的gtk_timeout_add()?在这种情况下,这可能是一种解决方案。但这是在主线程中运行的。但是,如果您需要执行长时间的异步任务,则最好使用真正的多线程。一旦您的线程完成计算,您可以使用类似于运行一次性空闲回调的方法来更新UI。结果(更新GUI所需的内容)在
gpointer
参数中传递。