|
|
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Почитал, что пишут про работу с GUI и возникло желание сделать что-то свое. Смысл такой, что при нажатии на кнопку (к примеру "Вход" после ввода логина и пароля) появляется анимация и висит до тех пор, пока новое окно не выполнит свою инициализацию. То, что получилось - ниже, просто хотелось бы знать, такой вариант вообще имеет право на жизнь ? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 09:46 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshunСмысл такой, что при нажатии на кнопку (к примеру "Вход" после ввода логина и пароля) появляется анимация и висит до тех пор, пока новое окно не выполнит свою инициализацию. То, что получилось - ниже, просто хотелось бы знать, такой вариант вообще имеет право на жизнь ? В JavaFX есть встроеные средства анимации. Поэтому этот лисапед не понятен совершенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 10:17 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Можно чуточку подробнее ? По каким словам гуглить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 10:21 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshunМожно чуточку подробнее ? По каким словам гуглить ? JavaFX Animation? :) http://docs.oracle.com/javafx/2/get_started/animation.htm http://docs.oracle.com/javafx/2/animations/jfxpub-animations.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 10:54 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Судя по коду, смысл такой: - запускается вспомогательный поток, который дает команду в потоке javafx сделать какую-то длинную работу - примерно раз в секунду этот поток дает команду в поток javafx отобразить какую-то информацию и дальше засыпает на секунду Таким образом, вся работа по-прежнему происходит в потоке javafx, а вспомогательный поток в основном спит. А надо бы так: - длинная работа делается во вспомогательном потоке - в потоке javafx отображаем анимацию средствами javafx, либо создаем обычный таймер (еще один поток), который посылает события для отображения счетчика. В этом случае поток javafx будет только обновлять внешний вид, а приложение остается отзывчивым все время создания нового окна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 11:17 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо, этот раздел еще не изучал :) Но я, видимо, немного некорректно задал вопрос в 1м посте, т.к. меня интересует не "анимация" etc (все эти плюшки можно вообще убрать), а именно "разгрузка" главного потока с целью избавиться от "зависания" приложения. ivanraСудя по коду, смысл такой: - запускается вспомогательный поток, который дает команду в потоке javafx сделать какую-то длинную работу - примерно раз в секунду этот поток дает команду в поток javafx отобразить какую-то информацию и дальше засыпает на секунду Таким образом, вся работа по-прежнему происходит в потоке javafx, а вспомогательный поток в основном спит. А надо бы так: - длинная работа делается во вспомогательном потоке - в потоке javafx отображаем анимацию средствами javafx, либо создаем обычный таймер (еще один поток), который посылает события для отображения счетчика. В этом случае поток javafx будет только обновлять внешний вид, а приложение остается отзывчивым все время создания нового окна Возможно не понял, что вы имеете в виду, но так и происходит. Приложение не "виснет" и полностью доступно. А "длинная" работа (цикл с задержками) и делается во вспомогательном потоке. Основной поток как раз не задействован, нет разве ? Если перенести эти циклы в @FXML private void newStageButtonAction(ActionEvent event) { } приложение как раз и будет висеть все эти 10 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 12:04 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshunНо я, видимо, немного некорректно задал вопрос в 1м посте Вы видимо написали код, который ниразу не понятно что делает. Что характеризует его соответствующим образом. korshun, т.к. меня интересует не "анимация" etc (все эти плюшки можно вообще убрать), а именно "разгрузка" главного потока с целью избавиться от "зависания" приложения. Для этого тоже есть готовые средства. http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm http://docs.oracle.com/javafx/2/api/javafx/concurrent/Worker.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 12:17 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshunПриложение не "виснет" и полностью доступно. т.е. пока юзверь авторизуется, он может снять средства со счёта? Игрушки всё это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 12:35 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Спасибо за "готовые средства", вопрос закрыт :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 12:43 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Апну тему. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. В документации (по ссылке выше) пишут: " First, the Task author may check the isCancelled method, inherited from FutureTask, to see whether the Task has been cancelled. ". Я так понял, что с помощью метода isCancelled можно проверить, была ли завершена задача. Проблема в том, что if(isCancelled()) { } вообще не срабатывает, т.е. "isCancelled" в message я не получаю :( Объясните плз, где туплю :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 10:47 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshun, Не успеваешь нажать кнопку? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 10:57 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Ну, RTFM же. http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html Second, if the Task implementation makes use of any blocking calls (such as NIO InterruptibleChannels or Thread.sleep) and the task is cancelled while in such a blocking call, an InterruptedException is thrown. cancel() вызывается во время sleep() и выкидывает InterruptedException. А логирование исключения в новом Thread нигде не прописано. Вот вам его и не видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:00 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Успеваю, задача останавливается. Перед TimeUnit.MILLISECONDS.sleep(100); специально добавлял System.out.println("x: "+x); что бы видеть все своими глазами. Мало того getState() возвращает CANCELLED Чесслово не понимаю, где туплю :( И туплю ли вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:03 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Это, кстати, такая мерзкая особенность FutureTask в Java. Они нигде не требуют обработки исключнений. Поэтому Threads и Executores молча сдыхают от исключений, которые нигде не логируются, если их вручную не ловить. Либо (опять же вручную) вешать UncaughtExceptionHandler. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:03 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Если правильно понял, о чем Вы, то вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. message тоже пустое :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:10 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshun, выложи компилябельный код, плз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:15 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, все в порядке, с try-catch действительно все работает :) Еще раз благодарю за уделенное время! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:31 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Добрый день, подскажите плз по классу ScheduledService, есть несколько непонятных моментов :( 1. При циклическом выполнении конструкция labelCount.textProperty().bind(ss.messageProperty()); строку из updateMessage не получает, label остается пустым. При этом вывод в консоль System.out.println(x + " - " + msg); идет нормально. Если останавливать выполнение при достижении какого-нибудь условия (пример ниже), то в label выводится строка из этого условия. Если убрать cancel(); то та же история: вывод в консоль идет, в label - нет. Код: java 1. 2. 3. 4. 5. 2. При остановке командой cancel(); условие if(isCancelled()) { } не выполняется. Сам класс. Полный компиляберный код под спойлером. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 09:48 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshun Код: java 1. 2. 3. 4. 5. 6. Это че за анахронизм ещё? Java 8 же! Что-то типа такого должно быть. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 10:43 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
updateMessage() меняет message у Task. A Label привязан к message Service. Внимание вопрос. Message у Task и Service как-то связаны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 10:49 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Код: java 1. :) Не привык еще к лямбдам, принципиальных отличий же нет, насколько понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 10:53 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczupdateMessage() меняет message у Task. A Label привязан к message Service. Внимание вопрос. Message у Task и Service как-то связаны? Вы хотите сказать, что нужно в bind() у label'a делать ссылку на Task ? Если да, то я не понимаю, как это можно сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 11:24 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshunВы хотите сказать, что нужно в bind() у label'a делать ссылку на Task ? Если да, то я не понимаю, как это можно сделать Я не знаю. Я спрашиваю. Мне пока некогда искать ответ в документации. Я думал вы уже знали ответ, если так сделали. Если не знаете, посмотрите в исходниках Task и Service. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 11:26 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
ОК. Посмотрел. В методе Service.start(), после создания task, message property task и service связываются. Странно что не работает. Вот тут на аналогичную проблему жалуются. http://stackoverflow.com/questions/20514410/long-running-task-in-javafx-service-results-in-flickering-update-messages-in-bou Но как я понял сообщение пишеться, затем затирается. Надо бы listener повесить на labelCount.text и посмотреть все изменения и откуда они приходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 11:55 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Вот тут на аналогичную проблему жалуются. http://stackoverflow.com/questions/20514410/long-running-task-in-javafx-service-results-in-flickering-update-messages-in-bou А не, то другое. Там выходит во время запуска сервиса, text у label стирается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 12:00 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38601773&tid=2127388]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 453ms |

| 0 / 0 |
