2014-10-08 2 views
0

Моя цель - запустить программу в java, которая выполняет список кода в определенное время каждый день.Обновление Calendar.SECOND in while loop

Я знаю утилиты TimerTask и Timer, но есть причина не использовать их. Большая часть моего кода запускается под циклом while с условием, что поток все еще жив.

Некоторые заявления:

static int theHour; 
static int theMinute; 
static int theSecond; 

Начало моего время цикла:

while (this.threadAlive) 
{ 
    System.out.println("START thread"); 
    theHour = theTime.get(Calendar.HOUR_OF_DAY); 
    theMinute = theTime.get(Calendar.MINUTE); 
    theSecond = theTime.get(Calendar.SECOND); 
    System.out.println("the second is: " + theSecond); 
    //... 
    //... 
    //... 
    try 
    { 
     if (theHour == 12 && theMinute == 39 && (theSecond >= 0 || theSecond < 10) ) 
     { 
     System.out.println("In the loop"); 
     if (super.connectToDevice()) 
     { 
      // Send the data command to the device 
      //out.println(COMMAND_GP); 
      System.out.println("Simulation of midnight is successful"); 

      // Read and store the data returned from the device 
      String data = in.readLine(); 

      data = "test gps data"; 
      // Send the data off to be processed 
      sendDataForProcessing(data); 

      // Disconnect from the device 
      super.disconnectFromDevice(); 


     } 

     } 

     //Catch any exceptions here 
} 

В результате в консоли примерно через 10 секунд выполнения:

START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 
START thread 
the second is: 46 

В результате я get для theSecond является правильным, но он никогда не обновляется после прохождения цикла снова. Мои объявления определены в глобальном масштабе в классе, и я попытался объявить их как int, но это не повлияло. Что я делаю неправильно?

+0

Он работает и распечатывает его намного быстрее, чем обновляется системный такт – ControlAltDel

+0

Это было бы правдой, если цикл while был так же прост, как и операторы печати. Список упоминаемого кода относится к подключению к микроконтроллеру, захвату данных, отключению, спящему, а затем возобновлению снова – KS7X

+0

Звучит довольно сложно – ControlAltDel

ответ

1

Ниже будет решить вашу проблему:

Попробуйте добавить это в начале Вашего цикла:

Calendar theTime = Calendar.getInstance(); 

Спасибо !!

0

Ответ: переменная объявляется как статический. Это означает, что после установки значения один раз его нельзя изменить.

Выньте «статическую», и вам будет хорошо идти.

EDIT: Теперь я вижу, что вы упоминали, что вы пробовали статически. Теперь мне интересно, как-то вы используете ранее скомпилированную версию кода, которая все еще рассматривает ее как статическую? Я не вижу другой причины, по которой это было бы проблемой.

+0

Да, спасибо, что заметили, что Хуан. Я не вижу, как он попытается запустить ранее скомпилированную версию. Я работаю в Eclipse и сохранил и скомпилировал программу перед запуском. – KS7X

+0

Можете ли вы попробовать сделать следующее: System.out.println (theTime.get (Calendar.SECOND)); (вместо печати «Секунда»), и в этом случае он все еще печатает одно и то же значение? –

+0

'static' не имеет ничего общего с« после того, как вы установите значение один раз, его нельзя изменить ». –