【发布时间】: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���
我尝试了什么:
- 将
msg设为全局变量以避免重新初始化 -- 否 结果 - 在信号创建中使用通用编组器 - 没有结果
- 传递指向
msg地址的链接而不是指向它的指针,不 结果也是。
问题是——我做错了什么?
提前致谢。
【问题讨论】: