gtk_main()和unix套接字

时间:2012-01-11 20:58:52

标签: linux sockets gtk gtk2

我正在使用C和unix低级套接字处理聊天应用程序。我已经成功制作了控制台版本,但我想为应用程序制作一个GUI。 我想将GTK用于GUI。 我的问题是如何“同步”套接字和GUI。 因为我必须调用gtk_main()作为最后一个GTK语句,并且应用程序本身是一个无限循环。如何在收到消息时更新GUI?

1 个答案:

答案 0 :(得分:9)

您遇到的问题是您同时拥有多个事件系统但只有一个线程。 Gtk +带有自己的事件处理程序,最终归结为select(),它将在任何用户输入或其他gtk事件上唤醒。您自己希望使用自己的事件处理来处理网络,事件处理通常由套接字上的select()或阻塞模式下的套接字组成。

一种解决方案是将您的事件集成到Gtk +的事件循环中。

你可以让Gtk + watch / select()你的套接字,并在状态发生变化时调用特定的函数(数据可读)。 请参阅http://developer.gnome.org/glib/2.30/glib-The-Main-Event-Loop.html

上的“创建新的来源类型”部分

另一种解决方案是使用Gtk +网络功能。

通常,您不希望对套接字执行如此特殊的操作,因为它不容易使用Glib IO通道进行包装。见http://developer.gnome.org/glib/2.30/glib-IO-Channels.html

第三种解决方案是启动第二个处理网络连接的线程,例如:使用posix线程或Gtk +线程功能。

将GUI与应用程序的工作者部分分开通常是一个好主意。但是对于聊天应用程序,它可能不会比其他解决方案带来任何好处。见http://developer.gnome.org/glib/2.30/glib-Threads.html