Linux gtk_main()和unix套接字
我正在使用C和unix低级套接字开发聊天应用程序。我已经成功地制作了控制台版本,但我想为应用程序制作一个GUI。 我想在GUI中使用GTK。 我的问题是如何“同步”套接字和GUI。Linux gtk_main()和unix套接字,linux,sockets,gtk,gtk2,Linux,Sockets,Gtk,Gtk2,我正在使用C和unix低级套接字开发聊天应用程序。我已经成功地制作了控制台版本,但我想为应用程序制作一个GUI。 我想在GUI中使用GTK。 我的问题是如何“同步”套接字和GUI。 因为我必须调用gtk_main()作为最后一条gtk语句,而应用程序本身就是一个无限循环。当收到消息时,如何更新GUI?您面临的问题是,一次有多个事件系统,但只有一个线程。Gtk+自带自己的事件处理程序,最终归结为一个select(),它将在任何用户输入或其他Gtk事件时唤醒。您自己希望通过自己的事件处理来处理网络,
因为我必须调用gtk_main()作为最后一条gtk语句,而应用程序本身就是一个无限循环。当收到消息时,如何更新GUI?您面临的问题是,一次有多个事件系统,但只有一个线程。Gtk+自带自己的事件处理程序,最终归结为一个
select()
,它将在任何用户输入或其他Gtk事件时唤醒。您自己希望通过自己的事件处理来处理网络,事件处理通常包括套接字上的select()
,或者在阻塞模式下使用套接字
一种解决方案是将事件集成到Gtk+的事件循环中。
您可以使Gtk+watch/select()
成为您的套接字,并在其状态更改时调用特定函数(数据可读)。
请参阅上的“创建新源类型”一节
另一个解决方案是使用Gtk+网络功能。
通常情况下,您不希望对套接字执行一些特殊的操作,因为它不容易用Glib IO通道包装。看
第三种解决方案是启动第二个线程来处理网络,例如使用posix线程或Gtk+线程功能。
将GUI与应用程序的辅助部分分离通常是一个好主意。但是,对于聊天应用程序,它可能不会比其他解决方案带来任何好处。看