问题描述:在js中使用dom组件,将js中的一个函数作为回调函数设置给dom组件;在主线程中调用这个回调函数没有问题,但是如果在另一个线程里面调用这个回调函数则总是失败。
原因:没有在主线程调用导致!
一、如何查看
1.直接在程序中上下文打印
root@android:/ # TVMSFmanagertest
>>>[tv_display] VideoHole is 0 0 1919 1079
>>>[tv_display] VideoAxis is 0 0 1919 1079
##########TK------->>>>>########gettid is 3130 //register线程号是3130
************start test interface and function***************
please input 0 1 to 5
0 is exit!
1 pindao jia
2 pindao jian
3 xuanze pindao
4 getCurrentProgramInfo
5 dtvFullScan
6 dtvManualScan
8 dtvStopScan
7 getProgramCount
5
############---TK--------->>>>gettid is 3131 //回调这里是3131
############---TK--------->>>>gettid is 3132
############---TK--------->>>>gettid is 3131
############---TK--------->>>>gettid is 3132
############---TK--------->>>>gettid is 3131
############---TK--------->>>>gettid is 3132
############---TK--------->>>>gettid is 3131
############---TK--------->>>>gettid is 3132
2.proc文件系统
cat /proc/3130/status
Name: TVMSFmanagertes
State: S (sleeping)
Tgid: 3130
Pid: 3130
PPid: 3026
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 6032 kB
VmSize: 6032 kB
VmLck: 0 kB
VmHWM: 1216 kB
VmRSS: 1216 kB
VmData: 2256 kB
VmStk: 136 kB
VmExe: 28 kB
VmLib: 2308 kB
VmPTE: 10 kB
VmSwap: 0 kB
Threads: 3 //一共有三个线程!!!!!
SigQ: 0/5812
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 00000000000094e8
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: ffffffffffffffff
CapBnd: ffffffffffffffff
Cpus_allowed: 3
Cpus_allowed_list: 0-1
voluntary_ctxt_switches: 110
nonvoluntary_ctxt_switches: 54
二、解决办法
调用DOM组件提供的方法:NS_DispatchToMainThread;将需要执行的JS部分回调函数放入主线程上下文。
三、其他问题
上述问题解决以后,发现在回调函数执行到二十次左右时仍然会挂掉,通过打印、发现回调部分函数指针为NULL;后经过分析,ffos引入了智能指针功能,当不再使用时、自动release资源。
后来,将该回调指针引入智能模板,问题解决。