通过jni方式调用外部dll的一个函数,通过按钮的click事件可以接收到信息,但通过timer的方式自动接收却收不到,按一下按钮收到第一条信息后,再用timer的方式调用又可以收到。在dll的函数加了printf,察看到二者传入的参数都相同,但就是用timer的方式收不到,不知道有人碰到过类似的现象没有?

解决方案 »

  1.   

    我碰到过
    Timer最终实际上是通过TimeQueue的单实例来判断的。我查了好久都没查到什么原因。估计和notify有关系,可能用到jni的东西,第一次会把TimeQueue锁住。只是猜想,没找到相关资料。各位可以找找。
    用最简单的方法来测试
    Timer t=new Timer(1000,this);
    System.in.read();这时t也不起作用了。
      

  2.   

    我的那个timer其实已经调用了dll的函数, debugger console里已经能定时返回函数printf出来的测试信息,但就是收不到数据。用按钮的click调用该函数就可以接收。后来把timer里改成触发按钮click来接收也不行,非要手工点一下那个按钮才能接收到信息。真奇怪啊,!·#¥%—
      

  3.   

    你的意思是action已经触发了,但收不到信息?
      

  4.   

    BTW:我2楼的代码少写了个t.start();
    就是说Timer start后直接read,结果Timer不起作用了
      

  5.   

    对,触发了按钮的click但接收不到,所以我觉得很纳闷,难道手工点按钮和其它方式调用还有某些潜在的不同?
      

  6.   

    只能一点一点的查了,这个问题估计很难找到解释我估计和notify有关。毕竟timer是通过notify来唤醒的你这样,先用Thread来测试,看看能不能收到
    如果不可以,则可能是线程接收的问题(估计不会)再通过wait和notify来设置Thread的等待,看看这样可不可以收到,如果不可以,很可能是Notify的问题。那你只能用Thread来替代Timer了如果可以,那我也不知道什么原因了,你干脆用Thread来做算了,留给sun去解决吧
      

  7.   

    谢谢楼上的建议。我改用Thread测试了一下,还是不能接收到信息。除非先用按钮接收一下才可以。
      

  8.   

    我感觉这个问题可能涉及到消息传递机制,有哪位大侠知道Java中有没有类似VC里PeekMessage、DispathMessage的方法?