linux - gtk_main() 和 unix 套接字

标签 linux sockets gtk gtk2

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

最佳答案

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

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

您可以让 Gtk+ watch/select() 成为您的套接字,并在它们的状态发生变化(数据可读)时调用特定函数。 请参阅 http://developer.gnome.org/glib/2.30/glib-The-Main-Event-Loop.html 上的“创建新源类型”部分

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

通常你不想对套接字做一些特别的事情,以至于它不容易用 Glib IO Channels 包装。参见 http://developer.gnome.org/glib/2.30/glib-IO-Channels.html

第三种解决方案是启动第二个线程来处理您的网络,例如具有 posix 线程或 Gtk+ 线程功能。

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

关于linux - gtk_main() 和 unix 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826523/

相关文章:

java - 套接字 - SocketException : Socket Closed - Java

c - 从 GtkTreeView 标记列获取显示的文本

c - 打开文件读取时出错 : Value too large for defined data type

android - android模拟器不启动,avd

linux - Vi - 使用带有 yank 的搜索命令

linux - 创建一个脚本守护进程来检查 httpd 服务是否打开或关闭

c - Socket Programming in C : When client exit server, 服务器崩溃

javascript - NodeJs socket.io 让所有客户端都进入房间

linux - 如何使用gdk和Rust获取当前事件窗口的标题?

python - 如何使 gtk.Layout 透明