用JNI调用Android控件在Android上绘图,过程如下:
在Java代码先分线程,然后在Java线程中调用C代码,在C中再分线程绘图,每次开始绘图前先保证前一个线程结束。
用全局变量BOOL g_bCancelThread;标记是否取消当前执行线程。
pthread_tg_Draw_Tid;记录当前线程ID。
以下代码:
int kill_rc = pthread_kill(g_Draw_Tid, 0);
if (kill_rc != ESRCH&& kill_rc != EINVAL) //如果之前的线程没执行完,则取消
{
g_bCancelThread= TRUE;
pthread_join(g_Draw_Tid, NULL);
}
判断g_Draw_Tid 是否还在执行,如果在执行,则设置g_bCancelThread为TRUE,然后在代码中判断g_bCancelThread的值,为TRUE时调用pthread_exit(NULL);退出自身线程。
正常情况这种方式没有一点问题,可是当绘图过于频繁时线程就容易崩溃。
可以用下面这几行代码来延迟每个线程启动的时间,如果前一个线程与后一个线程间隔时间小于150毫秒时,直接取消前一个线程的执行,可以避免程序崩溃。
仅有几行代码却很管用,试了几天才想到的,在此作个记录。
void func(...)
{
struct timeval time;
gettimeofday(&time, NULL );
g_curTime= time.tv_usec/1000 + time.tv_sec*1000;//毫秒
usleep(150*1000 );
gettimeofday(&time, NULL );
unsigned long timeT =time.tv_usec/1000+time.tv_sec*1000;
if(timeT-150 <g_curTime){
return;
}
......
pthread_create(&g_Draw_Tid, NULL, Thread_DrawRstVec, (void*)TArgs);//分线程画图
}
这种解决办法只是临时应对,刷新过快容易崩溃可能跟线程中分线程有关系。哪位高人有更好的解决办法请赐教,感激不尽!