C - GTK3 和线程
C - GTK3 and Threads
我用 C 编写了一个程序来测试动态 GTK 标签更改,但该程序在一些迭代后随机停止更新 GUI。
使用 PThreads API 创建一个新线程 - 直接在调用 gtk_main() 之前 - 我认为这是正确的方法,因为 GTK 参考手册说 gdk_threads_* 函数已弃用,不建议任何替代方法。
这是新创建线程的过程和入口点。
它只是将一个常量字符串与不断增加的迭代次数连接起来,并将其设置为标签,但不知何故,在不可预测的迭代次数后停止更新。
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,a.k.a。 GUI线程
- 在后台线程中完成繁重的工作,然后通知 GUI
对于通知部分,你应该使用pthreads
的IPC机制。
你可以使用g_idle_add ((GSourceFunc) yourfunc, NULL );在 运行 yourfunc 的线程内。在此 link 所有代码中:
http://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread
我用 C 编写了一个程序来测试动态 GTK 标签更改,但该程序在一些迭代后随机停止更新 GUI。
使用 PThreads API 创建一个新线程 - 直接在调用 gtk_main() 之前 - 我认为这是正确的方法,因为 GTK 参考手册说 gdk_threads_* 函数已弃用,不建议任何替代方法。
这是新创建线程的过程和入口点。 它只是将一个常量字符串与不断增加的迭代次数连接起来,并将其设置为标签,但不知何故,在不可预测的迭代次数后停止更新。
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,a.k.a。 GUI线程
- 在后台线程中完成繁重的工作,然后通知 GUI
对于通知部分,你应该使用pthreads
的IPC机制。
你可以使用g_idle_add ((GSourceFunc) yourfunc, NULL );在 运行 yourfunc 的线程内。在此 link 所有代码中:
http://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread