我正在为嵌入式板上的 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),我会看到主窗口的信号处理程序和对话框中的处理程序都被调用。
关闭对话框(关闭端口和通道...)我返回到主窗口。如果我读取条形码,将触发三个处理程序,两个在主窗口上,一个在对话框上。
我怎样才能断开信号处理程序?我认为我的方法不完整..
谢谢!
解决了!
我错过了电话
在关闭过程中。
当然,我更改了行以创建
source
一个全局变量: