2020-08-13 青旅半醒 2022-11-27 03:24 36阅读 0赞 g\_main\_loop\_new创建一个main loop对象, 一个main loop对象只能被一个线程使用, 但一个线程可以有多个main loop对象。 loop = g\_main\_loop\_new (NULL, TRUE); g\_main\_loop\_run (loop); g\_main\_loop\_run则是进入主循环, 它会一直阻塞在这里,直到让它退出为止。 有事件时,它就处理事件,没事件时就睡眠。 g\_main\_loop\_quit则是用于退出主循环, 相当于Win32下的PostQuitMessage函数 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ExMjM0NTY3ODkwOTg_size_16_color_FFFFFF_t_70][] **Timeout**它主要用于实现定时器,支持一次定时和重复定时,根据用户注册的回调函数的返回值而定。 1. g\_timeout\_prepare计算下一次的超时时间。 2. g\_timeout\_check检查超时时间是否到了,如果到了就返回TRUE,否则返回FALSE。 3. g\_timeout\_dispatch调用用户注册的回调函数。 线程可以向自己的mainloop中增加Source,也可以向其它线程的mainloop增加Source。向自己的mainloop中增加Source时,mainloop已经唤醒了,所以不会存在什么问题。而向其它线程的mainloop增加Source时,对方线程可能正挂在poll里睡眠,所以要想法唤醒它,否则Source可能来不及处理。在Linux下,这是通过wake\_up\_pipe管道实现的,mainloop在poll时,它除了等待所有的Source外,还会等待wake\_up\_pipe管道。要唤醒poll,调用g\_main\_context\_wakeup\_unlocked向wake\_up\_pipe里写入字母A就行了 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ExMjM0NTY3ODkwOTg_size_16_color_FFFFFF_t_70 1][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ExMjM0NTY3ODkwOTg_size_16_color_FFFFFF_t_70]: /images/20221124/55f2733744664eae9da6c9437db3d42e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ExMjM0NTY3ODkwOTg_size_16_color_FFFFFF_t_70 1]: /images/20221124/8bba69f6cd0a4a888a650a28cb442efa.png
还没有评论,来说两句吧...