问题描述:在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资源。
后来,将该回调指针引入智能模板,问题解决。