1. 程式人生 > >主事件迴圈

主事件迴圈

主迴圈一般如此寫:
while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}


首先在這個主迴圈之間,main函式已經對當前視窗類定製了其對應的訊息處理函式WndProc 。
這個訊息迴圈中的第一個函式 GetMessage(),從視窗訊息佇列頭獲得下一條訊息,直到GetMessage()返回0。
 BOOL GetMessage(
       LPMSG lpMsg,   // 檢索到的訊息
       HWND  hWnd,    // 視窗指向
       UINT  wMsgFilterMin, // 訊息範圍的下界限引數
       UINT  wMsgFilterMax  // 上界限引數
);


第一個引數一般設定為 &msg,而其他的引數沒太大作用,一般設定為NULL或0.這裡的引數msg是Windows用於放置文字訊息的儲存空間,是一個複雜的資料結構MSG,而不是之前的一個訊息ID:
typedef struct tagMSG {
    HWND        hwnd; // 視窗控制代碼
    UINT        message; // 訊息ID
    WPARAM      wParam; //詳細資訊
    LPARAM      lParam;//詳細資訊
    DWORD       time;//事件發生時間
    POINT       pt;//滑鼠位置
#ifdef _MAC
    DWORD       lPrivate;
#endif
} MSG



當一個程式中有一定的快捷鍵時,當按下快捷鍵時,呼叫TranslateAccelerator函式,將本身的按鍵訊息跟快捷鍵表中定義的按鍵進行比較,如果發現快捷鍵,就將這個按鍵訊息轉換為快捷鍵表中定義的訊息。
接下來呼叫TranslateMessage()函式,這個函式是一個虛擬加速鍵轉換器,進行訊息的翻譯。
最後呼叫 DispatchMessage()函式傳送訊息,這個函式中呼叫WinProc,並根據之前的MSG來發送給WinProc函式適當的引數。

相關推薦

事件迴圈

主迴圈一般如此寫:while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessag

Qt ------ 事件循環與 QEventLoop

man fin 等待 obj box cat tail 狀態 font 1、事件循環一般用exec()函數開啟。QApplicaion::exec()、QMessageBox::exec()都是事件循環。其中前者又被稱為主事件循環。 事件循環首先是一個無限“循環”,程序在e

從Chrome原始碼看事件迴圈

我們經常說JS的事件迴圈有微觀佇列和巨集觀佇列,所有的非同步事件都會放到這兩個佇列裡面等待執行,並且微觀任務要先於巨集觀任務執行。實際上事件迴圈是多執行緒的一種工作方式。通常為了提高執行效率會新起一條或多條執行緒進行並行運算,然後算完了就告知結果並退出,但是有時候並不想每次都新起執行緒,而是讓這些執行緒變成常

scrapy 自動終止事件迴圈

from twisted.internet import reactor # 事件迴圈 相當於selecet作用 監聽是否有連線成功(終止條件,所有的socket物件都被移除。) from twisted.web.client import getPage # socket物件(如果下載完成,自

不要阻塞事件迴圈(或工作池)

原文: Don’t Block the Event Loop (or the Worker Pool) 你應該閱讀本指南嗎? 如果您編寫比命令列指令碼更復雜的程式,那麼閱讀本文可以幫助您編寫效能更高,更安全的應用程式。 在編寫本文件時,主要是基於Node伺服器。但裡面的原則也適用

Edit on GitHub Node.js 事件迴圈,定時器和 process.nextTick()

Node.js 事件迴圈,定時器和 process.nextTick() 什麼是事件輪詢 事件迴圈是 Node.js 處理非阻塞 I/O 操作的機制——儘管 JavaScript 是單執行緒處理的——當有可能的時候,它們會把操作轉移到系統核心中去。 既然目前大多數核心都是多執行

nodejs事件迴圈

1. 只有一個主執行緒,node開始執行指令碼時,會先進事件迴圈初始化(同步任務,發出非同步請求,規劃定時器生效時間,執行promise.nextTick等),這時事件迴圈還未開始。 nodejs執行機制: V8引擎解析js指令碼 解析後的程式碼呼叫Node API

JS的事件迴圈機制eventloop

一. Eventloop是什麼?     javascript中事件任務分為巨集任務和微任務,執行順序是先執行巨集任務再執行微任務。    任務分為同步和非同步, 同步放入主執行緒立即執行,非同步的進入event Table並註冊函式,之後放入到eve

總結:JavaScript非同步、事件迴圈與訊息佇列、微任務與巨集任務

本人正在努力學習前端,內容僅供參考。由於各種原因(不喜歡部落格園的UI),大家可以移步我的github閱讀體驗更佳:傳送門,喜歡就點個star咯,或者我的部落格:https://blog.tangzhengwei.me 掘金:傳送門,segmentfault:傳送門 前言 Phili

淺談javascript的Event Loop(事件迴圈)

淺談javascript的Event Loop(事件迴圈) 無論是面試還是開發,我們總是有一些疑問 你:什麼疑問? 如:不是說好了JavaScript是單執行緒麼,處理的非同步程式碼? 為什麼我寫的一個ajax請求,但是卻先執行的下面的console.log? 再或者這樣, 面試官:小王

JavaScript 事件迴圈及非同步原理(完全指北)

引言 最近面試被問到,JS 既然是單執行緒的,為什麼可以執行非同步操作? 當時腦子蒙了,思維一直被困在 單執行緒 這個問題上,一直在思考單執行緒為什麼可以額外執行任務,其實在我很早以前寫的部落格裡面有寫相關的內容,只不過時間太長給忘了,所以要經常溫習啊:(淺談 Generator 和 Promise

(轉)總結:JavaScript非同步、事件迴圈與訊息佇列、微任務與巨集任務

前言 Philip Roberts 在演講 great talk at JSConf on the event loop 中說:要是用一句話來形容 JavaScript,我可能會這樣: “JavaScript 是單執行緒、非同步、非阻塞、解釋型指令碼語言。”

事件迴圈進階:macrotask與microtask

這段參考了參考來源中的第2篇文章(英文版的),(加了下自己的理解重新描述了下), 這裡沒法給大家演示程式碼,我就簡單說下我的理解吧。   promise和settimeout 在一起的時候執行順序是個有意思的事兒,   為什麼呢?因為Promise裡有了一個一個新的概念

Swoole 原始碼分析——Server模組之TaskWorker事件迴圈

swManager_start 建立程序流程 task_worker 程序的建立可以分為三個步驟:swServer_create_task_worker 申請所需的記憶體、swTaskWorker_init 初始化各個屬性、swProcessPool_start 建立程序 int swManager_

深度理解nodejs[2]-事件迴圈

程序與執行緒 我們在電腦中會執行多個程式,每一個程式中都會有多個執行緒。例如我們執行比特幣客戶端的時候,我們某一個執行緒要處理網路、某一個執行緒要處理挖礦、某一個執行緒要處理使用者輸入…執行緒的排程使用了作業系統級別的排程器來明確了哪一個執行緒應該被執行。執行緒也有優先順序之分,例如監聽滑鼠滑動的優先順

JS專題之事件迴圈

準備知識 1. 程序(process) 程序是系統資源分配一個獨立單位,一個程式至少有一個程序。比方說:一個工廠代表一個 CPU, 一個車間就是一個程序,任一時刻,只能有一個程序在執行,其他程序處於非執行狀態。 2. 執行緒(Thread) 執行緒是CPU排程和分派的基本單位,一個執行緒只能屬於一個程

單執行緒與事件迴圈

單執行緒指的是主執行緒是“單執行緒”的,所有阻塞的部分交給一個執行緒池處理,然後這個主執行緒通過一個佇列跟執行緒池協作,於是對我們寫到的js程式碼部分,不再關心執行緒問題,程式碼也主要由一堆callback回撥構成,然後主執行緒在不停的迴圈過程中,適時呼叫這些程式碼。 什麼是 Event Loo

程序,執行緒,Event Loop(事件迴圈),Web Worker

執行緒,是程式執行流的最小單位。執行緒可與同屬一個程序的其他執行緒共享所擁有的全部資源,同一程序中的多個執行緒之間可以併發執行。執行緒有就緒,阻塞,執行三種基本狀態。 阮一峰大神針對程序和執行緒的類比,很是形象:計算機的核心CPU,是個工廠,時刻運轉著,工廠裡有很多個車間(程序),一個車間開工其他車間不能開

從js 事件迴圈來看 setTimeout 與 promise

從這段程式碼的輸出來看兩者的關係。 原因如下:     一個瀏覽器環境(unit of related similar-origin browsing contexts.)只能有一個事件迴圈(Event loop),而一個事件迴圈可以多個任務佇列(Ta

Promise的事件迴圈

1.Promise 新建後立即執行 let promise = new Promise(function(resolve, reject) { console.log('Promise'); resolve(); }); promise.then(function() { c