Note that there are some explanatory texts on larger screens.

plurals
  1. POImprove accuracy of my timer thread
    primarykey
    data
    text
    <p>Below I have a thread that updates a 'clock' label once per second. Once the thread reaches 600 (10 mins) the timer stops. The thread seems to trail by approx five seconds every minute. So when <code>val</code> = 60, in actuality 65 seconds may have elapsed. I'm using midp so I dont think I can introduce any api's to help me with this task. How can I improve on the accuracy below class? I think whats slowing it down is the method convertValToTimerString, is there a better way of converting the current timer val to minutes:seconds format without using java formatter apis? </p> <p>Thanks,</p> <pre><code>public class LabelTimerUpdaterThread implements Runnable{ public static int val = 0; private int minuteValueInt = 0; private int secondValueInt = 0; private int tempSecondValueInt; public boolean isRunning = true; public LabelTimerUpdaterThread(){ } public void run() { while(isRunning){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } val += 1; incrementTimer(); if(val == 600){ break; } } } private void incrementTimer(){ Screen.timerLabel.setText(convertValToTimerString(val)); } private String convertValToTimerString(int val){ String minuteValString = ""; String secondValString = ""; if(val &lt; 10){ minuteValString = "00"; secondValString = "0"+String.valueOf(val); return minuteValString+":"+secondValString; } if(val &lt; 60){ minuteValString = "00"; secondValString = String.valueOf(val); return minuteValString+":"+secondValString; } if(val % 60 == 0){ ++minuteValueInt; } if(minuteValueInt &lt; 10){ minuteValString = "0"+String.valueOf(minuteValueInt); int secondVal = val % 60; if(secondVal &lt; 10){ return minuteValString+":0"+String.valueOf(secondVal); } else { return minuteValString+":"+String.valueOf(secondVal); } } return "10:00"; } public void stopThread(){ this.isRunning = false; } </code></pre> <p>Ok, now I am receiving an IllegalStateException when I try to upedate my timer label - Here is my code - </p> <p>Here i am instantiating my label - </p> <pre><code>timerLabel = new CustomLabelField("00:00" , Field.FIELD_LEFT , Constants.SMALL_FONT , Color.BLACK, Bitmap.getBitmapResource("bg_clock_white.png")); UpdateValTimer timer = new UpdateValTimer(th); timer.startTimer(); </code></pre> <p>This class creates the timer class and creates the class which will update the timer label.</p> <pre><code>public class UpdateValTimer { private Timer timer; private int val = 0; private UpdateView uv; private final CustomLabelField customLabelField; public UpdateValTimer(CustomLabelField field) { this.customLabelField = field; } public void startTimer(){ timer = new Timer(); uv = new UpdateView(customLabelField); Thread t = new Thread(uv); t.start(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { ++val; } }, 1000, 1000); } } </code></pre> <p>This class updates the timer label - public class UpdateView implements Runnable{</p> <pre><code> private int val = 0; private int minuteValueInt = 0; private final CustomLabelField timerLabel; public UpdateView(CustomLabelField timerLabel) { this.timerLabel = timerLabel; } public void run() { while(true){ this.timerLabel.setText(convertValToTimerString(this.val)); } } private String convertValToTimerString(int val){ String minuteValString = ""; String secondValString = ""; if(val &lt; 10){ minuteValString = "00"; secondValString = "0"+String.valueOf(val); return minuteValString+":"+secondValString; } if(val &lt; 60){ minuteValString = "00"; secondValString = String.valueOf(val); return minuteValString+":"+secondValString; } if(val % 60 == 0){ ++minuteValueInt; } if(minuteValueInt &lt; 10){ minuteValString = "0"+String.valueOf(minuteValueInt); int secondVal = val % 60; if(secondVal &lt; 10){ return minuteValString+":0"+String.valueOf(secondVal); } else { return minuteValString+":"+String.valueOf(secondVal); } } return "10:00"; } } </code></pre> <p>Thanks for any help</p> <p>After some initial testing this code seems to be working correctly.</p> <p>Thanks for all your help everyone.</p> <p>Any comments on what I could be doing better are welcome.</p> <pre><code>public class UpdateValTimer{ private int minuteValueInt = 0; private Timer timer; private int val = 0; private UpdateView uv; private CustomLabelField customLabelField; public UpdateValTimer(CustomLabelField field) { this.customLabelField = field; } public void startTimer(){ timer = new Timer(); uv = new UpdateView(customLabelField); Thread t = new Thread(uv); t.start(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { ++val; uv.setVal(convertValToTimerString(val)); } }, 1000, 1000); } private String convertValToTimerString(int val){ String minuteValString = ""; String secondValString = ""; if(val &lt; 10){ minuteValString = "00"; secondValString = "0"+String.valueOf(val); return minuteValString+":"+secondValString; } if(val &lt; 60){ minuteValString = "00"; secondValString = String.valueOf(val); return minuteValString+":"+secondValString; } if(val % 60 == 0){ ++minuteValueInt; } if(minuteValueInt &lt; 10){ minuteValString = "0"+String.valueOf(minuteValueInt); int secondVal = val % 60; if(secondVal &lt; 10){ return minuteValString+":0"+String.valueOf(secondVal); } else { return minuteValString+":"+String.valueOf(secondVal); } } return "10:00"; } } public class UpdateView implements Runnable{ private String timeElapsedCounter; private final CustomLabelField timerLabel; public UpdateView(CustomLabelField timerLabel) { this.timerLabel = timerLabel; } public void setVal(String timeElapsedCounter){ this.timeElapsedCounter = timeElapsedCounter; } public void run() { while(true){ synchronized(Application.getEventLock()){ timerLabel.setText(this.timeElapsedCounter); } } } } timerLabel = new CustomLabelField("00:00" , Field.FIELD_LEFT , Constants.SMALL_FONT , Color.BLACK, Bitmap.getBitmapResource("bg_clock_white.png")); UpdateValTimer timer = new UpdateValTimer(timerLabel); timer.startTimer(); </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload