Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277909
  • 博文数量: 65
  • 博客积分: 3091
  • 博客等级: 中校
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2005-01-25 09:44
文章存档

2013年(2)

2012年(11)

2011年(12)

2010年(13)

2009年(15)

2008年(12)

分类: LINUX

2009-03-19 21:27:48

GUI 的 main loop 监视 fd 的方式

GUI ,GUI 程序库方面常常运行于 event driven 的 main loop 中。在这种情况下,要监视从 socket 等方面来的数据,不能简单的采用阻塞的读写方式。因为那样会堵塞 GUI 的处理过程。

解决这个问题的方法有几个,不过,都需要 GUI 程序库方面的合作。

select

    GUI 一侧的 main loop 的 select 追加 fd
idle

    idle 时候实行的 callback 检查 fd
timer

    用定时器定期性地运行 callback 检查 fd

再者,GUI 的 main loop 以另外的线程(注意 Ruby 的线程不是 native 实现的)与 socket 通讯的方法也可考虑。同时,为了 socket 通讯而给 GUI 一侧带来了需要双方同步的影响,线程自己难成为根本的解决方案。
以下是各 GUI 程序库的一些方法:
    * Xt : 主循环 XtAppMainLoop
          o [select] XtAppAddInput (XtAddInput is obsolete)
          o [idle] XtAppAddWorkProc
          o [timer] XtAppAddTimeOut
    * GTK+
          o GLib: 主循环 g_main_loop_run
                + [select] g_source_add_poll
                + [idle] g_idle_source_new, g_idle_add
                + [timer] g_timeout_source_new, g_timeout_add
                + g_source_attach
          o GDK:
                + [select] gdk_input_add
          o GTK+ : 主循环 gtk_main
                + [idle] gtk_idle_add
                      # Gtk.idle_add
                + [timer] gtk_timeout_add
                      # Gtk.timeout_add
          o [ruby-ext:00438] 如果 Ruby 的东西顶替GLib 一侧的 select, Ruby 的线程能否不受影响的变动?
    * FOX
          o Timers, Signals and Input Messages
                + [select] FXApp::addInput
                + [idle] FXApp::addChore
                + [timer] FXApp::addTimeout
    * Qt : 主循环 QApplication::exec
          o [select] QSocketNotifier
          o [idle] QObject::startTimer
          o [timer] QObject::startTimer
    * Tcl/Tk
          o [select] Tcl_CreateFileHandler, fileevent
          o [idle] Tcl_DoWhenIdle, after idle
          o [timer] Tcl_CreateTimerHandler, after ms
    * wxWidgets : 主循环 wxApp::MainLoop
          o [select]
          o [idle] OnIdle, wxIdleEvent
          o [timer] wxTimer
    * fltk
          o [select] fltk::add_fd
          o [idle] fltk::add_idle
          o [timer] fltk::repeat_timeout
    * Cocoa
          o [select] CFRunLoopSource
          o [timer] CFRunLoopTimer

阅读(1393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~