Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux gtk_main()和unix套接字_Linux_Sockets_Gtk_Gtk2 - Fatal编程技术网

Linux gtk_main()和unix套接字

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事件时唤醒。您自己希望通过自己的事件处理来处理网络,

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

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

一种解决方案是将事件集成到Gtk+的事件循环中。 您可以使Gtk+watch/
select()
成为您的套接字,并在其状态更改时调用特定函数(数据可读)。 请参阅上的“创建新源类型”一节

另一个解决方案是使用Gtk+网络功能。 通常情况下,您不希望对套接字执行一些特殊的操作,因为它不容易用Glib IO通道包装。看

第三种解决方案是启动第二个线程来处理网络,例如使用posix线程或Gtk+线程功能。 将GUI与应用程序的辅助部分分离通常是一个好主意。但是,对于聊天应用程序,它可能不会比其他解决方案带来任何好处。看