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-5,AlexNet ,VGGNet,GoogLeNet,ResNet)
卷積神經網路 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分支中,學習如何建立神經網路(包含一個深度神經網路),以及如