在java里面调用Dll的一个函数,这个函数计算量较大,大概400ms才能执行完(但不是死循环,肯定能返回的)java里面不停的循环调用dll的函数,靠该函数的结果进行下一步运算
运行中出现这样一个问题,循环调用一段时间后,dll中的函数迟迟不返回,
不知道是正在dll中计算,还是其他问题?vc中dll的代码在java里运行时,能调试么?还有,能不能设个超时时间,如果在一定时间dll的函数没有返回,就强制返回??
运行中出现这样一个问题,循环调用一段时间后,dll中的函数迟迟不返回,
不知道是正在dll中计算,还是其他问题?vc中dll的代码在java里运行时,能调试么?还有,能不能设个超时时间,如果在一定时间dll的函数没有返回,就强制返回??
你试想一下,如果这个算法在java语言中实现,也需要那么长时间才能返回,调用多次以后会出现类似死锁的情况你希望有个超时限制,你会怎么解决这个问题,那么在native方法中也是这么解决问题,思路是一样的,只是方法略有不同而已。
可是还是想不到~~如果不能修改dll中的代码,怎么在外部让它停止呢?
while(isActive){
int result = MyDll.function();//调用dll的函数
doOtherTask(result);//进行
}
如果现在程序陷在MyDll.function()里面,而dll里的代码又不能修改,该怎么让它跳出来?
因为线程自己遇到阻塞是不能够自我释放与返回,只能由其它线程来控制这个线程。
例如一个解决方案,你给定这个线程一个状态,调用方法状态和没调用方法状态,当状态为调用时,且执行时间超过某个限定值,你的另外一个监听线程终止这个线程并启用新线程来继续运行。这是一种解决方案,但是不一定会是最好的解决方案,因为终止线程无法继续接下来的操作(当然你可以在其他地方完善接下来的操作,例如新启动的线程内),还有频繁启用新线程比较消耗系统资源(内存或者CPU资源)。
如果你不太了解线程,需要去学习了,线程是一个比较复杂的东西,而且你的需求对线程知识的掌握要求也比较高。
主线程内定时(比如100ms)判断是否返回数据,如果超时(比如1s)就终止thread其实也不是很麻烦(最简单的做法)当然也就是6楼说的那种
如果改成这样,岂不是要启动无数个线程~~ ⊙﹏⊙b汗Timer timer = new Timer(1000);//设置一个1000ms的定时器,到时停止dllThread线程
while(isActive){
timer.start();//启动定时器
Thread dllThread = new Thread(MyDll.function());//使用子线程调用dll的函数
dllThread.start();
...
//waite for dllThread返回后
doOtherTask(result);//进行其他操作
}