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
阅读(1456) | 评论(0) | 转发(0) |