Программа не ждет завершения таймера, прежде чем продолжить цикл - PullRequest
0 голосов
/ 20 марта 2012

У меня есть следующий код, который запускается всякий раз, когда вы нажимаете кнопку «Пуск» в моей программе.Я обозначил в комментариях, где я хочу, чтобы таймер ушел, проблема в том, что когда я делаю thread.sleep(time), это останавливает мою программу!Итак, мне было интересно, может ли кто-нибудь просто добавить atimer в мой код, чтобы он запускал первый бит, ждал, а затем запускал его снова на основе bumpNum.

Code:

public class startReplyButtonListener implements ActionListener{


        public void actionPerformed(ActionEvent ev){

            int length = textAreaReplyMessage.getText().length();
            int remLen = 400 - length;

            String strHTML = neo.get("http://www.neopets.com/neoboards/topic.phtml?topic=" + txtTopicID.getText());
            /*strHTML = neo.post("/neoboards/process_topic.phtml?", new String[][] {{"boardType", "topic_id", "board_id", "message", "next", "remLen"}, {"reply", txtTopicID.getText(), "4", textAreaReplyMessage.getText() , "1", ((Integer)remLen).toString()}});

            if(strHTML.contains("No topic with ID")){
                txtLog.append("Invalid Topic ID! \n");
            }
            else{
                txtLog.append("Bumped Topic ID " + txtTopicID.getText() + "\n");
            }
            */
            System.out.println(strHTML);
            bumpNum = 5;
            wait = Integer.parseInt(textWait1.getText()) * 1000; //converting to miliseconds

            int i=1;
            do{
                strHTML = neo.post("/neoboards/process_topic.phtml?", new String[][] {{"boardType", "topic_id", "board_id", "message", "next", "remLen"}, {"reply", txtTopicID.getText(), "4", textAreaReplyMessage.getText() , "1", ((Integer)remLen).toString()}});

                txtLog.append("Board Bumped. Waiting "+ ((Integer)(wait/1000)).toString() +" Seconds..." + "\n");

                //ADD TIMER HERE
                i++;



            }while(i <= bumpNum);

        }

        }

ЧтоЯ хочу выполнить:

Пользователь указывает, сколько раз он хочет «публиковать» (обозначается bumpNum), цикл будет сначала публиковаться один раз:

strHTML = neo.post("/neoboards/process_topic.phtml?", new String[][] {{"boardType", "topic_id", "board_id", "message", "next", "remLen"}, {"reply", txtTopicID.getText(), "4", textAreaReplyMessage.getText() , "1", ((Integer)remLen).toString()}});

Затем: на основе пользователейпосле ввода, он будет ждать сколько угодно секунд (txtWait1) и ТОГДА повторить приведенный выше код публикации до тех пор, пока он не достигнет bumpNum.

И он обновит txtLog со следующим КАКИМ ВРЕМЯМ, в течение которого он ударяет (поэтому программа не может быть заморожена)):

txtLog.append("Board Bumped. Waiting "+ ((Integer)(wait/1000)).toString() +" Seconds..." + "\n");

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Изменить:

Вздох. Хорошо, теперь я понимаю. Я не знаю ответа. Вы говорите о рисовании элемента GUI. Я подозреваю, что вы хотите раскрутить поток, чтобы выполнить работу, а затем показать графический интерфейс, который вы ожидаете. Вам нужно дождаться завершения потока (см. Мой join код ниже) все время, когда обновляется элемент GUI, ДО того как он завершится при отображении какого-либо результата.

Это зависит больше от кода GUI, чем от режима сна / таймера. Я бы начал новый вопрос сейчас и объяснил !!! НЕ С КОДОМ !!! но с псевдокодом с 1000 футов просмотра, что вы хотите. Что-то вроде:

Я пытаюсь развить поток, который работает в фоновом режиме в [Swing / Android / etc]. Я хочу показать пользователю, что поток был разветвлен, я хочу, чтобы пользовательский интерфейс ожидал поток без замораживания, а затем я хочу, чтобы пользовательский интерфейс join с потоком и отобразил результаты.

Думайте о проблеме так, как мы должны думать о ней. Ожидайте вопросы, которые мы будем задавать. Выясните, что мы не знаем и не можем знать о вашей среде.

Удачи.

Edit:

Если вы просто пытаетесь вызвать сон, вам не нужно для этого создавать поток. Все, что вам нужно сделать в вашем коде:

  try {
      Thread.sleep(waitingTime);
      System.out.println(waitingTime);
  } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      e.printStackTrace();
  }

Это приостановит текущий поток (который может быть основным потоком) на миллисекунды waitTime.


Итак, вы очень быстро разветвляетесь на 3 темы, что, я думаю, вы не хотите делать. Если вы пытаетесь дождаться завершения каждого потока, вам придется сделать что-то вроде:

 Thread thread = new Thread(new Counter(wait));
 thread.start();
 thread.join();

Пара других комментариев:

  • Считать неправильным запускать поток в конструкторе класса считается плохим: new Thread(this).start();
  • Вы создаете 2 объекта потока внутри своего Runnable. Вы должны просто создать один вне вашего Runnable. Смотри выше.

    Thread myCounter = new Thread(this);  << #1
    public Counter(int waitingTime) {
       new Thread(this).start();          << #2
    }
    
  • Я бы не инициализировал waitingTime = 0; при определении и инициализировал бы его в конструкторе. Это смущает. Снимите = 0.

        int waitingTime;                    << remove the =0 here
        public Counter(int waitingTime) {
           this.waitingTime = waitingTime;
    
  • Когда вы поймаете InterruptedException, обязательно обращайтесь с ним правильно. Хорошим примером является сброс флага прерывания и / или выход из потока:

    } catch (InterruptedException e) {
        // resets the interrupt flag cleared by catching the exception
        Thread.currentThread.interrupt();
        // or stops the thread immediately
        return;
    }
    
0 голосов
/ 20 марта 2012

Вы запускаете новую тему каждый раз через цикл.Вместо того, чтобы создавать новый поток в конструкторе, переместите цикл do/while в обычный метод, а не в метод запуска нового потока.То, что вы делаете, - это создание нового потока, который фактически спит, но это не тот поток, который выполняет цикл, так что поток просто продолжает работать как обычно.

...