我正在嵌入式板上为 Linux 操作系统编写 GTK C 应用程序。
第一个主窗口打开一个串行(虚拟)端口,用于接收来自条形码阅读器的数据。我正在使用标准 open() 函数(在我的 OpenPort() 函数内)。然后我调用 g_io_channel_new_file() 和 g_io_add_watch() 来处理 rx 信号。
我真的需要标准的 open() 调用吗?
if (g_config.fdRfid==-1)
g_config.fdRfid = OpenPort( g_config.portRfid, B115200);
if (g_config.fdRfid!=-1)
{
ShowMainMessage();
GError *error = NULL;
g_ioChannel = g_io_channel_new_file( g_config.portRfid, "r", &error);
if (g_ioChannel)
{
guint source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);
printf("> set watch ioCh: %p - source: %d\n", g_ioChannel, source);
}
else
gtk_label_set_text( GTK_LABEL(g_labelMsg2), error->message);
当我按下按钮时,我会打开一个对话框子窗口:在此之前,我通过 close() 函数关闭串行端口,并通过 g_io_channel_shutdown() 函数断开信号。返回的状态为 1 = G_IO_STATUS_NORMAL。
GIOStatus status = g_io_channel_shutdown( g_ioChannel, TRUE, NULL);
g_io_channel_unref(g_ioChannel);
if (g_config.fdRfid != -1)
{
ClosePort(&g_config.fdRfid);
}
启动对话框窗口,我再次打开相同的端口(这是一个用于测试的窗口),并以与之前相同的方式重新连接 rx 信号。
现在,如果我在调试输出中读取条形码(通过 printf),我会看到主窗口的信号处理程序和对话框中的处理程序都被调用。
关闭对话框(关闭端口和通道...)我返回主窗口。如果我读取条形码,则会触发三个处理程序,两个在主窗口上,一个在对话框上。
如何断开信号处理程序?我认为我的方法不完整..
谢谢!
答案1
解决了!
我错过了电话
g_source_remove(source)
在结案程序中。
当然,我更改了该行以创建source
全局变量:
/*guint*/ source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);