JNI分线程在Android上绘图刷新过快容易崩溃的处理

本文介绍使用JNI在Android上绘图时遇到的线程管理问题及解决方案。通过控制线程启动时间间隔避免频繁绘图导致的程序崩溃,并提供具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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);//分线程画图
}
  

这种解决办法只是临时应对,刷新过快容易崩溃可能跟线程中分线程有关系。哪位高人有更好的解决办法请赐教,感激不尽!

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值