notes on GMainLoop and GSource

 

It is possible to create new instances of GMainLoop recursively. This is often used in GTK+ applications when showing modal dialog boxes.


To allow multiple independent sets of sources to be handled in different threads, each source is associated with a GMainContext. A GMainContext can only be running in a single thread, but sources can be added to it and removed from it from other threads.

event sources are associated with a particular GMainContext, and will be checked and dispatched for all main loops associated with that GMainContext.

Each event source is assigned a priority. The default priority, G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher priorities. Values greater than 0 denote lower priorities. Events from high priority sources are always processed before events from lower priority sources.


A new source type is created by deriving from the GSource structure. The derived type of source is represented by a structure that has the GSource structure as a first element, and other elements specific to the new source type. To create an instance of the new source type, call g_source_new() passing in the size of the derived structure and a table of functions. These GSourceFuncs determine the behavior of the new source types.


 
 
  1. typedef struct {
  2.   gboolean (*prepare)  (GSource    *source,
  3.                         gint       *timeout_);
  4.   gboolean (*check)    (GSource    *source);
  5.   gboolean (*dispatch) (GSource    *source,
  6.                         GSourceFunc callback,
  7.                         gpointer    user_data);
  8.   void     (*finalize) (GSource    *source); /* Can be NULL */
  9.   /* For use by g_source_set_closure */
  10.   GSourceFunc     closure_callback;        
  11.   GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
  12. } GSourceFuncs;
  • For idle sources, the prepare and check functions always return TRUE to indicate that the source is always ready to be processed. The prepare function also returns a timeout value of 0 to ensure that the poll() call doesn't block (since that would be time wasted which could have been spent running the idle function).
  • For timeout sources, the prepare and check functions both return TRUE if the timeout interval has expired. The prepare function also returns a timeout value to ensure that the poll() call doesn't block too long and miss the next timeout.
  • For file descriptor sources, the prepare function typically returns FALSE, since it must wait until poll() has been called before it knows whether any events need to be processed. It sets the returned timeout to -1 to indicate that it doesn't mind how long the poll() call blocks. In the check function, it tests the results of the poll() call to see if the required condition has been met, and returns TRUE if so.


States of a Main Context




Updating the GUI during a long computation.

        /* computation going on */
...
        while (gtk_events_pending ())
          gtk_main_iteration ();
...
        /* computation continued */


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值