在java里面调用Dll的一个函数,这个函数计算量较大,大概400ms才能执行完(但不是死循环,肯定能返回的)java里面不停的循环调用dll的函数,靠该函数的结果进行下一步运算
运行中出现这样一个问题,循环调用一段时间后,dll中的函数迟迟不返回,
不知道是正在dll中计算,还是其他问题?vc中dll的代码在java里运行时,能调试么?还有,能不能设个超时时间,如果在一定时间dll的函数没有返回,就强制返回??

解决方案 »

  1.   

    在java中调用dll其实和在java中执行java代码是一样的,java吧dll本地库当成自身程序的扩展来使用。
    你试想一下,如果这个算法在java语言中实现,也需要那么长时间才能返回,调用多次以后会出现类似死锁的情况你希望有个超时限制,你会怎么解决这个问题,那么在native方法中也是这么解决问题,思路是一样的,只是方法略有不同而已。
      

  2.   

    一个很简单的例子,你在java中调用一个在网络中读取数据的接口,而这个接口在未读到下一个数据时会阻塞,直到获取下一个数据。这个时候你就要考虑如果断线了,你希望阻塞到一定时候断开连接并返回,你要怎么做一样。
      

  3.   

    谢谢 spiniper
    可是还是想不到~~如果不能修改dll中的代码,怎么在外部让它停止呢?
    while(isActive){
        int result =  MyDll.function();//调用dll的函数
        doOtherTask(result);//进行
    }
    如果现在程序陷在MyDll.function()里面,而dll里的代码又不能修改,该怎么让它跳出来?
      

  4.   

    用另外一个线程来侦听这个线程的运行情况,具体代码你可以自己来实现。
    因为线程自己遇到阻塞是不能够自我释放与返回,只能由其它线程来控制这个线程。
    例如一个解决方案,你给定这个线程一个状态,调用方法状态和没调用方法状态,当状态为调用时,且执行时间超过某个限定值,你的另外一个监听线程终止这个线程并启用新线程来继续运行。这是一种解决方案,但是不一定会是最好的解决方案,因为终止线程无法继续接下来的操作(当然你可以在其他地方完善接下来的操作,例如新启动的线程内),还有频繁启用新线程比较消耗系统资源(内存或者CPU资源)。
    如果你不太了解线程,需要去学习了,线程是一个比较复杂的东西,而且你的需求对线程知识的掌握要求也比较高。
      

  5.   

    简单的说就是改成异步调用每次调用的时候都新建thread
    主线程内定时(比如100ms)判断是否返回数据,如果超时(比如1s)就终止thread其实也不是很麻烦(最简单的做法)当然也就是6楼说的那种
      

  6.   

    但我那个主程序要不停地循环n次呀,n>1000
    如果改成这样,岂不是要启动无数个线程~~  ⊙﹏⊙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);//进行其他操作
    }