对一个数据采集系统而言,通常需要一个图形交互界面,同时底层的采集过程也在连续进行并不断刷新,并不断显示和更新图形界面(比如刷新波形图)。
通常,图形界面GUI本身即是一个循环,界面上的控件产生信号,界面主循环MainLoop能够响应这些信号并执行相应的回调函数。
在LabWindows/CVI以及C#.NET里,这个问题很好解决,使用一个Timer控件即可。Timer控件可以实时产生一个TICK信号/事件,比如CVI里就是EVENT_TIMER_TICK。我们只需要把回调函数和这个TICK事件连接起来,在图形界面主循环执行过程中会循环响应这个Timer控件发出的TICK,并执行callback。callback可以是采集函数、波形显示函数等等。这样就做到了底层采集过程和主界面同时进行和刷新。T
但是,gtk没有类似上面提到的Timer这样功能的部件。glib中只有Gtimer相关的函数,但只是一个计时器,并不能实时循环产生信号。GtkMain本身即是一个循环。对于采集过程而言,我们也希望能够循环执行数据采集、波形显示和刷新过程,但是主界面循环和采集过程循环怎么同时执行呢?
在stackoverflow上有关于这个问题的很好的回答:http://stackoverflow.com/questions/8826523/gtk-main-and-unix-sockets点击打开链接
One solution is to integrate your events into the event loop of Gtk+.
You can make Gtk+ watch/