MainThread

JavaShareClient
1.隊列:
裏面有一個隊列static SkDeque gFuncPtrQ(sizeof(FuncPtrRec));
這個隊列裏面的類型是
    struct FuncPtrRec {
        void (*fProc)(void* payload);
        void* fPayload;
    };
2.入隊函數
void JavaSharedClient::EnqueueFunctionPtr(void (*proc)(void* payload),
                                              void* payload)
向隊列放入成員
調用這個函數的地方有如下幾處:
a.static void anp_postEvent(NPP instance, const ANPEvent* event)
b.void EnqueueFunctionPtrAndroid(void (*proc)(void*), void* payload)//MainThreadAndroid調用
c.void AndroidThreading::scheduleDispatchFunctionsOnMainThread()//MainThreadAndroid調用,support同2
d.WebIconDatabase::didImportIconURLForPageURL

a.anp_postEvent->JavaSharedClient::EnqueueFunctionPtr
b.WebIconDatabase::didImportIconURLForPageURL->JavaSharedClient::EnqueueFunctionPtr
c.MainThread.cpp->scheduleDispatchFunctionsOnMainThread->EnqueueFunctionPtrAndroid->JavaSharedClient::EnqueueFunctionPtr
MainThread.cpp->AndroidThreading::scheduleDispatchFunctionsOnMainThread()->JavaSharedClient::EnqueueFunctionPtr
2.1
dispatchFunctionsFromMainThread
callOnMainThread
callOnMainThreadAndWait
setMainThreadCallbacksPaused


3. 調度函數
void JavaSharedClient::ServiceFunctionPtrQueue()
取出元素進行處理。
這個函數在void JavaBridge::ServiceFuncPtrQueue(JNIEnv*)調用,就是java的
所以nativeServiceFuncPtrQueue->JavaBridge::ServiceFuncPtrQueue->
JavaSharedClient::ServiceFunctionPtrQueue()->JavaSharedClient::ServiceFunctionPtrQueue()
3.1 調度函數入口
JavaSharedClient::EnqueueFunctionPtr
void JavaBridge::ServiceFuncPtrQueue
env->CallVoidMethod(mJavaObject, mSignalFuncPtrQueue);
JWebCoreJavaBridge.signalServiceFuncPtrQueue
所以每添加一個就會調度一次。




4.其他
scheduleDispatchFunctionsOnMainThread()
{EnqueueFunctionPtrAndroid(timeoutFired, 0);}
會把某些函數讓主線程調用,傳入函數指針。
但是這裏卻傳入了另一個消息隊列處理函數,相當於一種級聯吧,功能有擴充,還沒細看。


既然有消息處理,那肯定有放入隊列的地方。
就是上面的callOnMainThread和callOnMainThreadAndWait


5.總結
所以要在主線程執行有如下幾種辦法
JavaSharedClient::EnqueueFunctionPtr。
callOnMainThread和callOnMainThreadAndWait

當然後兩種調用的是第一個的函數。



6.主線程的初始化
有webcore線程調過來,調用到
Webkit InitializeThreading.cpp中的initializeThreading。
會將主線程id設置爲當前線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章