【问题标题】:C - GTK3 and ThreadsC - GTK3 和线程
【发布时间】:2017-03-22 02:00:55
【问题描述】:

我用 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 中动态更新标签、按钮等的正确方法是什么?

【问题讨论】:

    标签: c multithreading gtk3


    【解决方案1】:

    问题是您想在另一个线程中更新 GUI。这不是一个好主意。在构建 GUI 应用程序时应该做什么(这不是 GTK+ 特定的):

    • 更新主线程中的 GUI,也就是 GUI 线程
    • 在后台线程中完成繁重的工作,然后通知 GUI

    通知部分使用pthreads的IPC机制。

    【讨论】:

    • 为了正确起见,您更喜欢使用本机 gtk 函数,即我的示例中的 gtk_timeout_add()?
    • 在这种情况下,这可能是一个解决方案。但这是在主线程中运行的。但是如果你需要做一个长的异步任务,真正的多线程是更可取的。
    • 一旦你的线程完成计算,你可以使用类似gdk_threads_add_idle的东西来运行一个更新UI的一次性空闲回调。结果(更新 GUI 所需的)在 gpointer 参数中传递。
    【解决方案2】:

    你可以使用 g_idle_add ((GSourceFunc) yourfunc, NULL );在线程内部运行 yourfunc。在此链接中的所有代码:

    http://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2020-02-21
      • 1970-01-01
      相关资源
      最近更新 更多