vscode原始碼分析 五 事件分發機制

2022-02-04 12:13:34 字數 2356 閱讀 2111

第一篇: vscode原始碼分析【一】從原始碼執行vscode

第二篇:vscode原始碼分析【二】程式的啟動邏輯,第乙個視窗是如何建立的

第三篇:vscode原始碼分析【三】程式的啟動邏輯,效能問題的追蹤

第四篇:vscode原始碼分析【四】程式啟動的邏輯,最初建立的服務

once(lifecycleservice.onwillshutdown)(() => (configurationservice as configurationservice).dispose());
上面這句話語義好直白呀!一旦lifecycle裡發生了willshutdown的事件,就執行後面的**函式!

那我們看看lifecycle裡的這個onwillshutdown(src\vs\platform\lifecycle\electron-main\lifecyclemain.ts)

private readonly _onwillshutdown = this._register(new emitter());

readonly onwillshutdown: event= this._onwillshutdown.event;

發現它是被_register註冊的,這個檔案裡並沒有_register函式,函式在它的父類disposable裡(src\vs\base\common\lifecycle.ts)

我一直以為這是資源釋放的類,沒想到還有事件相關的內容,哈!

private readonly _store = new disposablestore();

protected _register(t: t): t

return this._store.add(t);

}

看來,還得看disposablestore的add方法:

public add(t: t): t 

if ((t as any as disposablestore) === this)

marktracked(t);

if (this._isdisposed) else

return t;

}

marktracked這個方法不用管,裡面什麼也沒乾!

_todispose就是個set,用來存你傳入的事件的;

另外,這個函式有個特別之處,就是你喂了它什麼它就拉了什麼出來!

因為我們喂了它乙個emitter的例項,那我們就去看看emitter(src\vs\base\common\event.ts)

這是個泛型型別

有個get屬性:

get event(): event

didcall = true;

return result;

} as any as t;

}

很好理解,傳入乙個方法,返回乙個方法,

我們知道,我們傳入的是:

lifecycleservice.onwillshutdown
前面我們說了,它確實是乙個方法;

這個once還返回了乙個匿名函式;

我們通過這個匿名函式,把我們的事件處理邏輯,繫結給了:lifecycleservice.onwillshutdown

這是繫結的關鍵**:

ok!我們再去看那個this._event返回的方法具體幹了啥?!

傳入的引數,listener是我們的匿名**函式

() => (configurationservice as configurationservice).dispose()
emitter例項的_listeners屬性已經在別處初始化成了linkedlist的例項;

const remove = this._listeners.push(!thisargs ? listener : [listener, thisargs]);
這句話把我們的匿名**函式加到這個linkedlist中去了

好,以上是繫結事件,

我們再來看看這個事件被觸發的時候是怎樣的

this._onwillshutdown.fire(

}});

在這個fire方法中:

for (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) 

while (this._deliveryqueue.size > 0) else

} catch (e)

}

迴圈派發了所有註冊的事件

mosquitto原始碼分析(五)

本文由逍遙子撰寫,請標註原址 3.2.1 poll機制簡介 poll機制是一種i o多路轉接 i o multiplexing 技術,這種技術先構造乙個有關描述符的表,然後呼叫乙個函式,知道這些描述符中的乙個已準備就緒好進行i o時,該函式才返回,該函式返回之後它告訴程序那些描述符已經準備好進行i ...

mosquitto原始碼分析(五)

原 2014年03月18日 16 02 52 更多個人分類 linux 計算機網路 mqtt mosquitto c c 所屬專欄 mqtt協議及其應用 計算機網路 本文由逍遙子撰寫,請標註原址 3.2.1 poll機制簡介 poll機制是一種i o多路轉接 i o multiplexing 技術,...

uC OS II原始碼分析(五)

每個任務被賦予不同的優先順序等級,從0 級到最低優先順序os lowest pr1o,包括0 和 os lowest pr1o 在內。當 c os 初始化的時候,最低優先順序os lowest pr1o 總是被賦給空閒任務idle task 注意,最多工數目os max tasks 和最低優先順序數...