【问题标题】:Creating gtk signal for editing GtkWidget running in other thread创建 gtk 信号以编辑在其他线程中运行的 GtkWidget
【发布时间】:2018-05-15 09:18:08
【问题描述】:

我有一个应用程序,它基本上在终端模式下运行,但它可以在另一个线程中打开它的 GUI 部分(带有GtkTextView 的简单窗口打印一些消息)。 当主线程中发生某些事件时,我需要手动更新此 GtkTextView 的内容。为此,我创建了一个 'new-message-received' 信号,它应该传递一个指向 char 数组 msg 的指针并带有要打印的消息

创建新信号:

g_signal_new("new-message-received",
              G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
              0, NULL, NULL,
              g_cclosure_marshal_VOID__POINTER,
              G_TYPE_NONE, 1, G_TYPE_POINTER);

将其与处理函数连接:

g_signal_connect(G_OBJECT(demo_window), "new-message-received", 
                 G_CALLBACK(print_demo_message),(gpointer)msg);

并发出信号:

if (flag){
memset(msg, 0, 256);
g_signal_emit_by_name(G_OBJECT(demo_window), 
                     "new-message-received", 
                     (gpointer) msg);
...
}

问题是信号处理程序得到了一些损坏的指针(我尝试将它打印到标准输出——它总是一些随机的 4 个符号)而不是传递的消息。 处理程序是:

void print_demo_message(gpointer *param)
{
    const gchar* message = (const gchar*)param;
    g_print("Got message: %s\n", message);
    ...
}

输出如下:

Got message: p���

我尝试了什么:

  1. msg 设为全局变量以避免重新初始化 -- 否 结果
  2. 在信号创建中使用通用编组器 - 没有结果
  3. 传递指向msg 地址的链接而不是指向它的指针,不 结果也是。

问题是——我做错了什么?

提前致谢。

【问题讨论】:

    标签: c pthreads gtk signals


    【解决方案1】:

    必须自己解决这个问题,根本不需要使用信号。

    GTK 的主线程是一个线程,从这里调用gtk_main()。禁止在其主线程之外访问任何 GTK 对象。因此,为了启动 GTK GUI 的线程,我使用了 g_thread_new()g_idle_add(print_demo_message, msg) 来“要求”GTK 主线程将 msg 粘贴到 GtkTextView

    所以,现在看起来像这样:

    APP MAIN THREAD:
    
    if(%some_condition%){
         msg = malloc(256);
         sprintf(msg, "Some text");
         g_idle_add(print_demo_message, msg);
    }
    

    GUI THREAD:
    
    boolean print_demo_message(gpointer data)
    {
        gchar* message = data;
        g_print("Got message: %s\n", message);
     ...
    }
    

    消息传输正常,就像魅力一样工作:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多