如何为不同的上下文而不是默认上下文附加GIOChannel?

时间:2014-06-21 10:36:15

标签: sockets asynchronous

我正在编写一个简单的服务器和客户端应用程序,它使用套接字进行通信。 在客户端,我创建了一个 GIOChannel 来监听socket事件,例如read,write,exception..etc。客户端提供了一些异步API。

我编写了一个示例应用程序来测试我的代码,该代码创建 g_main_loop 并为键盘事件创建一个GIOChannel。

mainloop = g_main_loop_new(NULL, FALSE);
channel = g_io_channel_unix_new(0);
g_test_io_watch_id = g_io_add_watch(channel, (GIOCondition)(G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL), test_thread, NULL);
g_main_loop_run(mainloop);  

如果我不在回调函数 test_thread 中循环或阻塞主线程,它工作正常。例如,当我调用客户端的任何异步API时,我将sleep放入我的示例程序中一段时间​​,并在主线程唤醒时期望来自服务器的异步消息。但是这没有发生,客户端套接字只有在调用API的主线程返回后才从服务器读取异步消息的读取事件。

由此我了解了为同一默认上下文注册的keyboad事件和套接字事件,并且主事件调度程序无法同时通知它们。

我必须让我的程序这样一种方式,即客户端的套接字读取不应该依赖于 g_main_loop 的默认上下文,以便同步和异步都将从单独的线程发生。

我通过GNome文档找到了一些API,用于仅为默认上下文添加GIOChannel。我必须将为套接字读取创建的GIOChannel添加到不同的上下文中。

有人可以建议我怎么做,或者有没有更好的选择可用于使用GLIB异步处理套接字读取。

谢谢。

0 个答案:

没有答案