Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-GTK3和螺纹_C_Multithreading_Gtk3 - Fatal编程技术网

C-GTK3和螺纹

C-GTK3和螺纹,c,multithreading,gtk3,C,Multithreading,Gtk3,我用C编写了一个程序来测试动态GTK标签更改,但该程序在经过一些迭代后会立即停止更新GUI 在调用gtk_main()之前,直接使用PThreads API创建一个新线程,我认为这是正确的方法,因为gtk参考手册说gdk_threads_*函数已被弃用,并且没有建议任何替代方法 这是新创建的线程的过程和入口点。 它只是随着迭代次数的增加而压缩一个常量字符串,并将其设置为标签,但不知何故,在不可预测的迭代次数停止更新之后 void * change_text(void * args) {

我用C编写了一个程序来测试动态GTK标签更改,但该程序在经过一些迭代后会立即停止更新GUI

在调用gtk_main()之前,直接使用PThreads API创建一个新线程,我认为这是正确的方法,因为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,也称为GUI线程
  • 在后台线程中执行重载,然后通知GUI
对于通知部分,您应该使用
pthreads

的IPC机制,您可以使用g_idle\u add((GSourceFunc)yourfunc,NULL);在线程内部运行func。在此链接中,所有代码:


为了正确起见,您更愿意使用本机gtk函数,即我的示例中的gtk_timeout_add()?在这种情况下,这可能是一种解决方案。但这是在主线程中运行的。但是,如果您需要执行长时间的异步任务,则最好使用真正的多线程。一旦您的线程完成计算,您可以使用类似于运行一次性空闲回调的方法来更新UI。结果(更新GUI所需的内容)在
gpointer
参数中传递。