Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blackberry TimerTask不按预定间隔执行_Blackberry_Timer - Fatal编程技术网

Blackberry TimerTask不按预定间隔执行

Blackberry TimerTask不按预定间隔执行,blackberry,timer,Blackberry,Timer,我正在为BlackBerry编写一个秒表应用程序(类似于BlackBerry内置的秒表)。有一个计时器标签,以MM:SS:T(分、秒、秒的十分之一)的格式显示当前时间。标签使用TimerTask每100毫秒刷新一次 应用程序运行良好,时间显示正确,但有时计时器标签未按预定间隔(每100毫秒)更新。计时器标签暂停(不计数)一段时间,然后继续计数(同时仍然正确显示时间) 我的想法是,在暂停期间,不会执行TimerTask来更新计时器标签。你知道为什么应用程序会这样,以及如何修复它吗 下面是更新计时器

我正在为BlackBerry编写一个秒表应用程序(类似于BlackBerry内置的秒表)。有一个计时器标签,以MM:SS:T(分、秒、秒的十分之一)的格式显示当前时间。标签使用TimerTask每100毫秒刷新一次

应用程序运行良好,时间显示正确,但有时计时器标签未按预定间隔(每100毫秒)更新。计时器标签暂停(不计数)一段时间,然后继续计数(同时仍然正确显示时间)

我的想法是,在暂停期间,不会执行TimerTask来更新计时器标签。你知道为什么应用程序会这样,以及如何修复它吗

下面是更新计时器标签的线程:

public class ThreadUpdateTime extends Thread  
{  
  private MyMainScreen myMainScreen;  
  private Timer updateTimerLabelTimer = new Timer();

  public ThreadUpdateTime(MyMainScreen parent)
  {
    myMainScreen=parent;
  }

  public void run() 
  {
    try {
      updateTimerLabelTimer.schedule(new RecordTimer(myMainScreen), TIMER_DELAY, TIMER_INTERVAL);

    } catch (Exception e)  {
      //put alert here
    }
  }

  public void iStop()
  {
    updateTimerLabelTimer.cancel();
  }
}
timerTask:

public class RecordTimer extends TimerTask  
{  
  private MyMainScreen myMainScreen;  
  public RecordTimer(MyMainScreen parent)  
  {  
    myMainScreen=parent;  
  }  

  public void run()   
  {  
    myMainScreen.iUpdateTimerLabel();  
  }  
}  
以及iUpdateTimerLabel方法:

public void iUpdateTimerLabel()  
{  
//calculate : sign, sMin, sSec, sTenth     

  synchronized(Application.getEventLock())  
  {  
    lblSpotTime.setText(sign+sMin+":"+sSec+"."+sTenth+" ");  
  }    
} 

首先是测量它。。。记录timertask开始和结束时的时间戳,看看这是否真的是问题所在。有了这些,我想到的几件事是

  • 您的任务是否被阻塞(可能处于打开状态) 有什么事吗
  • 同一区域是否还有其他任务
    计时器
    实例?我不知道它是否是这样指定的,但是任务可能都在一个线程上运行,因此如果另一个任务妨碍了您,您的任务可能不会在指定的确切时间间隔内运行
  • 您的
    TimerTask
    是否与UI事件循环正确同步(即,它是否以正确的
    runLater()
    或blackberry UI提供的任何方法更新标签)?如果不这样做,UI事件循环可能不会注意到您已更改了标签。我认为在Blackberry上,正确的做法是或者可能是
    invokeAndWait()
    ,这取决于您试图实现的目标
  • 代码发布后编辑:

    以下是一些有用的相关资源

  • 好的,我还是要说用一些日志记录或println调用来插入代码以输出 它运行时的时间戳
  • 不确定为什么
    schedule()
    调用在它自己的
    Runnable
    内。。。你不需要这样,但也许你的应用程序正在这样做,因为我看不出什么原因。如果您认为您正在为计时器创建一个显式线程,那么您不是。您可能只需创建
    计时器
    ,然后从任何应用程序线程中调用
    schedule()
    Timer
    包含一个执行这项工作的捕获线程,引入另一个线程可能是多余的和令人困惑的
  • 我仍然认为你可能想做一些事情,比如:
  • 另一个提醒是实际测量计时器正在做什么,而不是依赖于我的推测
    TimerTask中的代码

    public void iUpdateTimerLabel()  
    {  
    //calculate : sign, sMin, sSec, sTenth     
    
    // synchronized(Application.getEventLock())  
      UiApplication.getUiApplication().invokeLater(
        new Runnable() { 
          @Override
          public void run() {
            lblSpotTime.setText(sign+sMin+":"+sSec+"."+sTenth+" ");  
          }
        });  
    } 
    
    您的
    synchronized
    呼叫可能足以防止事情爆发,但这并不是首选的方法。如果
    Timer
    线程专用于此单一用途,那么如果愿意,您可能可以将
    invokeAndWait()
    替换为
    invokeAndWait()


    其他人可能能够解释仅仅持有UI锁和实际在UI线程上运行之间的区别,但我猜后者会强制执行
    无效()
    ,而前者不会。这可以解释为什么标签更改只是偶尔出现。

    建议您发布
    TimerTask
    的代码以及提交给
    计时器的代码。这可能与计时器无关,尤其是。参见相关内容:你好,安德森,我刚刚发布了我的代码。你能指出我可能遗漏了什么吗。谢谢。我已经尝试了“invokeLater()”并且得到了相同的结果,我可能需要测量计时器。谢谢你的帮助。@Tuyen Nguyen:让我们知道你发现了什么。我肯定还遗漏了什么。这是该应用程序的完整源代码:该项目是使用BlackBerry JDE Eclipse插件、JRE 5.0.0、模拟器BlackBerry Storm开发的。希望任何人都能看到问题所在。