C - GTK3 和线程

标签 c multithreading gtk3

我用 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,也就是 GUI 线程
  • 在后台线程中完成繁重的工作,然后通知 GUI

对于通知部分,你应该使用pthreads的IPC机制。

关于C - GTK3 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29898844/

相关文章:

c - 错误: expected specifier-qualifier-list before

java - 如何在 Servlet 中的 doGet 和 doPost 方法之间传递局部变量?

java - 等到线程列表结束

valgrind - 带有 GTK 的 GUI 有几个内存泄漏

python-3.x - 关闭 PyGTK 窗口,如果焦点是增益,然后是丢失

c - 使用 open() 和 read() 读取 C 中的二进制整数文件

将 C 结构复制到字符数组

java - 将值传递给java中的float格式说明符

java - Android:在加载内容时运行动画

GTK+ 3 状态图标替换