2016-06-26 4 views
4

Я разрабатываю проект java, через который через компьютер подключается внешнее устройство микроконтроллера через последовательный порт. У меня есть диалоговое окно ожидания в приложении java, ожидающее выполнения команды на микроконтроллере. Если микроконтроллер не отвечает в течение 10 секунд, приложение отключается.while цикл не выполнен

Проблема в том, что некоторые команды выполняются слишком быстро, и микроконтроллер отвечает до того, как активируется диалог ожидания. Это приводит к отключению приложения через десять секунд.

Вот первая идея, которую я думал, что ждать диалог, чтобы быть видимым:

new Thread() { 
    public void run() { 
     while (!Main.mainFrame.waitDialog.isVisible()) {} 
     Main.usbManager.start(); 
    } 
}.start(); 

Но применение застрял в то время цикла и диалог ожидания виден, но если добавить некоторое случайное предложение для цикла while, например, System.out.flush();, он работает, и когда диалог виден, программа выходит из цикла while.

Как подождать, пока диалог будет виден?

Благодаря

ответ

5

Большинство графических библиотек однопоточно. Это означает, что вызовы на него могут быть небезопасными, вы никогда не увидите изменений. В частности, значения boolean могут быть встроены, поэтому после определенного момента вы можете быть уверены, что не увидите изменения в значении.

Если вы используете что-то, что замедляет цикл, оно не будет оптимизировать код на некоторое время (это ненадежно) или имеет барьер памяти, например System.out.flush(), тогда эта оптимизация не произойдет.

Лучшим способом опроса может быть использование Thread.yield() или Thread.sleep(40), чтобы сэкономить некоторый процессор.

+0

Спасибо! 'Thread.yield()' сделал трюк! – Cako

3

Я думаю, что есть проблема с методом .isVisible() и общий сбой использования цикла While.

если добавить некоторое случайное предложение цикла в то время как, например, System.out.flush() ;, он работает

Существует вопрос с проблемой «похож Why does while(true) loop just run once - Java» на вкладке в то время как петля

он работает со случайным методом, как System.out.println()

Я думаю, что вы должны вызвать что-то, когда фактическое окно в другом потоке закрывается в этом потоке, поэтому вам не нужно ждать.

+0

Спасибо! Я должен больше узнать о развитии событий. – Cako

Смежные вопросы