gpt4 book ai didi

创建 gtk 信号以编辑在其他线程中运行的 GtkWidget

转载 作者:行者123 更新时间:2023-11-30 14:48:32 26 4
gpt4 key购买 nike

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

输出如下:

收到消息:p���

我尝试过的:

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

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

提前致谢。

最佳答案

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

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

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

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);
...
}

消息已传输成功,就像魅力一样:)

关于创建 gtk 信号以编辑在其他线程中运行的 GtkWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50346486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com