1. 程式人生 > >sofsip學習系列--GLib學習筆記二,事件迴圈

sofsip學習系列--GLib學習筆記二,事件迴圈

按著glib的文件順序,先來看看事件迴圈吧。
從最簡單的例子開始:
//mainloop0.c
#include<glib.h>
GMainLoop* loop;
int main(int argc, char* argv[])
{
    //g_thread_init是必需的,GMainLoop需要gthread庫的支援。
    if(g_thread_supported() == 0)
        g_thread_init(NULL);
    //建立一個迴圈體,先不管引數的意思。
    g_print("g_main_loop_new/n");
    loop = g_main_loop_new(NULL, FALSE);
    //讓這個迴圈體跑起來
    g_print("g_main_loop_run/n");
    g_main_loop_run(loop);
    //迴圈執行完成後,計數器減一
    //glib的很多結構型別和c++的智慧指標相似,擁有一個計數器
    //當計數器為0時,自動釋放資源。
    g_print("g_main_loop_unref/n");
    g_main_loop_unref(loop);
    return 0;
}
好了,現在編譯:
gcc -g `pkg-config --cflags --libs glib-2.0 gthread-2.0` mainloop0.c -o mainloop0
然後執行:
./mainloop0
你會發現程式會在g_main_loop_run函式阻塞,這就是glib main loop了,如果沒有人通知它退出,它是不會退出的。
通知迴圈退出的函式是g_main_loop_quit。
怎麼通知呢?主執行緒被g_main_loop_run阻塞了,沒辦法執行quit。本來我準備開一個執行緒,sleep一秒鐘,然後呼叫g_main_loop_quit。不過一想我們都在學習高精尖武器了,還用土槍土炮幹啥。使用glib的定時器吧~
//mainloop1.c
#include<glib.h>
GMainLoop* loop;

gint counter = 10;
gboolean callback(gpointer arg)
{
    g_print(".");
    if(--counter ==0){
        g_print("/n");
        //退出迴圈
        g_main_loop_quit(loop);
        //登出定時器
        return FALSE;
    }
    //定時器繼續執行
    return TRUE;
}

int main(int argc, char* argv[])
{
    if(g_thread_supported() == 0)
        g_thread_init(NULL);
    g_print("g_main_loop_new/n");
    loop = g_main_loop_new(NULL, FALSE);
    //增加一個定時器,100毫秒執行一次callback
    g_timeout_add(100,callback,NULL);
    g_print("g_main_loop_run/n");
    g_main_loop_run(loop);
    g_print("g_main_loop_unref/n");
    g_main_loop_unref(loop);
    return 0;
}
編譯執行:
gcc -g `pkg-config --cflags --libs glib-2.0 gthread-2.0` mainloop1.c -o mainloop1
./mainloop1
Yeah!一秒鐘後,程式正常退出了!定時器好簡單!
今 天到此為止。最後思考一個問題,glib的main loop主要提供給gtk使用,是gtk介面事件迴圈的基礎,這是無可非議的。但是,在別的地方,比如我們普通的console、service程式中, 有必要用main loop麼?main loop還能夠應用在哪些場合? 

相關推薦

sofsip學習系列--GLib學習筆記事件迴圈

按著glib的文件順序,先來看看事件迴圈吧。從最簡單的例子開始://mainloop0.c#include<glib.h> GMainLoop* loop;int main(int argc, char* argv[]){    //g_thread_init是必

webservice 教程學習系列(六)——監聽請求使用eclipse的TCP_IP工具(埠轉發)

有的情況我們本身的開發機可能不能連線網際網路,但是我們需要呼叫一些網際網路的介面,到時候放在生產伺服器就可以直接呼叫。那麼我們繼續使用上次說的直接在dos視窗上面解析wsdl的URL連結就不行了,因為連線不通。 這個時候我們就可以 使用eclipse的這個TCP_IP工具了。 首先

框架學習系列 mybatis 第十篇 mapper映射文件之輸出映射

總結 www. XML 聲明 com 2.4 res rom 用戶 1: mapper映射文件輸出映射(輸入類型) 2:resultType的使用 3:resultMap的使用 3:總結&下節預告 本文是《凱哥陪你學系列-框架學習之mybatis框架學習》中第十二篇

opengl學習之路三十視差貼圖

本節暫未進行完全的重寫,錯誤可能會很多。如果可能的話,請對照原文進行閱讀。如果有報告本節的錯誤,將會延遲至重寫之後進行處理。 視差貼圖(Parallax Mapping)技術和法線貼圖差不多,但它有著不同的原則。和法線貼圖一樣視差貼圖能夠極大提升表面細節,使之

AI: 開始學習AI--Machine Learning 。建立機器學習資料模型。

 AI:開始學習AI--第一課 Machine Learning 。二,使用預測資料模型。ML環境建立完成之後,要開始第一個實驗如何使用外部資料模型。在Azure Machine Learning中找到DATASETS 然後單擊Samples,能看到如下資料。但這次要學習的,

虛幻4引擎原始碼學習筆記():主迴圈LaunchEngineLoop

虛幻引擎主迴圈為LaunchEngineLoop.cpp,LaunchEngineLoop.h LaunchEngineLoop.cpp裡面有3000+行程式碼,包含了整個虛幻引擎生命週期的流程 依.cpp順序依次看一下 引用庫和變數定義 大部分功能的庫都被引

動態規劃學習系列——區間DP(

上一篇我們看了區間型DP的一道經典入門題——石子歸併,這一次同樣是類似的一道題——石子歸併2 題目連結:wikioi 2102 題幹不同之處在於,現在我們的石子不是排成一列了,而是圍成一個環,我們要怎麼把問題轉化成普通的石子歸併呢? 其實這是一種挺常見的演

大資料學習系列——HIVE學習分割槽

分割槽查詢 Hive查詢執行分割槽語法 SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08'; 分割槽表的意義在於優化查詢。查詢時儘量利用分割槽欄位。如果不使用分割槽欄位,就會全部掃描

斯坦福大學-自然語言處理與深度學習(CS224n)筆記 第八課 迴圈神經網路

課程概要 1、傳統語言模型 2、迴圈神經網路 3、例項(python) 4、RNN處理的一些技巧 5、針對其他任務的序列模型 6、總結 一、傳統語言模型 語言模型可以計算一些系列的單詞的概率P(w1,…,wT) 可以用來進行機器翻譯 單詞順序:p(the

spring 學習系列 --- 配置學習

1、maven repository mvn倉庫 管理各種依賴關係,例如, <!-- https://mvnrepository.com/artifact/aspectj/aspectjrt --> <dependency> <groupId>as

spring學習系列 --- AOP學習

1、AOP是什麼? 面向切片程式設計 可以實現各種註釋功能,在某個函式呼叫之前、執行以及呼叫之後,實現某些功能,並且可以訪問該函式中的引數,以及打印出結果來。 使用的jar包主要是三個: AspectJ  aopalliance.jar    aspec

【JavaScript 學習--12】JS深入理解呼叫棧事件迴圈機制回撥佇列

最近研究JavaScript裡的函式事件這些到底是如何呼叫的,查閱了好些資料,特別是國外一些大牛寫的文章,啟發非常的大,於是打算對這些知識進行梳理。 基本知識 JS是什麼? JS是單執行緒,非阻塞,非同步,併發的語言 JS有 呼叫棧,事件迴圈,回撥

SpringCloud | Docker 學習系列 | Kubernetes 學習 將SpringCloud Eureka 服務註冊與發現部署到docker中並放入到Kubernetes中管理

一、前言      很早之前就想寫這篇文章,終於有點時間來填坑了。之前都是在公司伺服器上搭建的,這次在自己的電腦上搭建好了環境,再來完善這篇部落格。二、環境準備     此次環境已經搭建完畢     kubernetes  v1.9.0     docker 17.03.2-

node原理事件迴圈setTimeout/setImmediate/process.nextTick的差別

事件迴圈 Node.js 在主執行緒裡維護了一個事件佇列,當接到請求後,就將該請求作為一個事件放入這個佇列中,然後繼續接收其他請求。當主執行緒空閒時(沒有請求接入時),就開始迴圈事件佇列,檢查佇列中是否有要處理的事件,這時要分兩種情況:如果是非 I/O 任務,就親自處理,並通過回撥函式返回到

機器學習與深度學習系列連載: 第二部分 深度學習(十)卷積神經網路 3 經典的模型(LeNet-5AlexNet VGGNetGoogLeNetResNet)

卷積神經網路 3 經典的模型 經典的卷積神經網路模型是我們學習CNN的利器,不光是學習原理、架構、而且經典模型的超引數、引數,都是我們做遷移學習最好的源材料之一。 1. LeNet-5 [LeCun et al., 1998] 我們還是從CNN之父,LeCun大神在98年提出的模

springMVC學習筆記(獲取引數返回Model資料)

Controller如何獲取引數            1利用原有的Servlet方法,使用HttpServletRequest 2利用@RequestParam註解 @RequestParam("username")String name,當username在reques

Django學習筆記:實現部落格詳情完善文章的分類和標籤

前面我已經學會了使用Django框架搭建一個簡單的部落格框架。接下來學習的就是如何完善部落格的功能。 部落格詳情 功能 當用戶點選文章的“繼續閱讀”按鈕時,實現瀏覽文章的具體內容。即當點選“繼續閱讀”時根據傳入的請求和文章的id引數跳轉到對應的

Python之pandas學習筆記() 取數和篩選插入行列賦值

如下圖是pandas的Dataframe清洗資料步驟,包括資料行列選取,賦值,更改列名集重建索引的思維導圖: 文章目錄 一、資料選取-普通行列總結: 二、 資料選取-按條件篩選行列 總結 三、重建索引和更改列名總結

<吳恩達老師深度學習筆記>第一周深度學習介紹(未完待續)

神奇 建立 網絡筆記 1.3 展示 定義 信息 英語 輸出 摘要: 本篇博客僅作為筆記,如有侵權,請聯系,立即刪除(網上找博客學習,然後手記筆記,因紙質筆記不便保存,所以保存到網絡筆記)。   1.1 歡迎   深度學習常常運用於:讀取X光圖像、個性化教育、精準化農業、駕駛

<吳恩達老師深度學習筆記>第一週深度學習介紹(未完待續)

摘要: 本篇部落格僅作為筆記,如有侵權,請聯絡,立即刪除(網上找部落格學習,然後手記筆記,因紙質筆記不便儲存,所以儲存到網路筆記)。   1.1 歡迎   深度學習常常運用於:讀取X光影象、個性化教育、精準化農業、駕駛汽車等領域。深度學習處於AI分支中,學習如何建立神經網路(包含一個深度神經網路),以及如