MainThread
来源:互联网 发布:宽带网络安装 编辑:程序博客网 时间:2024/06/07 02:35
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
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设置为当前线程。
- MainThread
- Handler、MainThread、Looper、MessageQueue
- subthread(handling busy operation) notify mainthread to update UI
- GCD 编程和 andriod 的Handler、MainThread、WorkThread
- 使用Handler把WrokThread的数据传到主线程MainThread中
- Unity多线程(Thread)和主线程(MainThread)交互使用类
- EventBus源码解读详细注释(2)MainThread线程模型分析
- AndroidSchedulers.mainThread()无法切换到主线程,原来是细节问题啊
- Service是否在mainThread中执行,service里面是否能执行耗时操作
- MainThread agent ERROR Could not determine hostname or ip address; proceeding.
- unity+Loom实现多线程(Thread)和主线程(MainThread)交互
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
- Android MainThread(UI线程/主线程) 与 WorkThread(主线程以外的线程) 相互sendMessage
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
- IOS中画图方法列举
- 知易游戏开发教程cocos2d-x移植版001
- hdu 2577 How to Type
- 基于SSDT HOOK技术的Ring0级进程保护组件设计与实现
- 解决乱码问题 如何配置过滤器
- MainThread
- 关键链项目管理(二) 关键链
- Redhat配置EPEL软件源
- RedHat配置git server
- 在 Windows7 虚拟机VMware7.1.4上安装雪豹snow Leopard 10.6
- poj1274 匈牙利算法
- C中的volatile用法
- MONGODB的特性和PHP-MONGODB环境的搭建
- asp.net实现邮箱激活账号