【问题标题】:gtk_main() and unix socketsgtk_main() 和 unix 套接字
【发布时间】:2012-02-08 05:41:15
【问题描述】:

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

【问题讨论】:

    标签: linux sockets gtk gtk2


    【解决方案1】:

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

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

    您可以让 Gtk+ 监视/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

    【讨论】:

      【解决方案2】:

      这是一个在 python 中使用pygobject 使用GLib.IOChannel 在 gtk 主事件循环中添加监视的示例。

      一只手表用于收听新的连接。 另一个用于接收数据。

      这是改编自这个 pygtk 示例:http://rox.sourceforge.net/desktop/node/413.html

      import gi    
      gi.require_version('Gtk', '3.0')    
      from gi.repository import Gtk, GLib;    
      from socket import socket    
          
      def listener(io, cond, sock):    
          conn = sock.accept()[0]    
          GLib.io_add_watch(GLib.IOChannel(conn.fileno()),0,GLib.IOCondition.IN, handler, conn)    
          return True    
          
      def handler(io, cond, sock):    
          print(sock.recv(1000))    
          return True    
          
      s = socket()    
      s.bind(('localhost', 50555))    
      s.listen()    
      GLib.io_add_watch(GLib.IOChannel(s.fileno()), 0, GLib.IOCondition.IN, listener, s)    
          
      Gtk.main()    
      

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        相关资源
        最近更新 更多