|
|
|
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 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshun2. При остановке командой cancel(); условие if(isCancelled()) { } не выполняется. А разве call() после cancel() вообще вызывается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 12:06 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshun, Попробуйте задать первончальное значение task message в createTask(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 12:07 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Обнулил setPeriod. Четко видно, что в label'е мелькают данные - получается они туда все таки попадают, но такое ощущение, что сразу же затираются.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 12:33 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshunОбнулил setPeriod. Четко видно, что в label'е мелькают данные - получается они туда все таки попадают, но такое ощущение, что сразу же затираются.. Ага. Я думаю так. Вызывается createTask() - там Task с пустым message. Возможно он заранее создаётся и в результате затирает текст на пустой. А потом updateMessage() показывает новый текст, но сразу же затирается из-за нового вызова createTask(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 12:37 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Получается так. В общем для того, что бы в label что-то отображалось, придется вешать в Task() sleep(), равный setPeriod. Благодарю, что помогли разобраться! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 13:14 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Туплю, setPeriod в этом случае вообще можно не трогать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 13:18 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
korshun, я бы багу засабмитил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 13:30 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
С удовольствием, но не знаю, как это сделать :) На Java только с месяц назад "подсел". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 13:36 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Ну нельзя так. Task.Call вызывается в отдельном потоке, а доступ к x, msg ничем не защищен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 14:40 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
ivanraTask.Call вызывается в отдельном потоке, а доступ к x, msg ничем не защищен updateMessage() и есть специальный метод для использования из любых потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 14:42 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Что там отображается - отдельная история (хотя, может, это всё взаимосвязано), но - msg и x инициализируются в потоке javafx - а изменяются в методе Task.Call Код: java 1. 2. , который работает в другом потоке. Неизвестно, вызывается ли Task.Call в синхронизированном блоке, к сожалению, исходники javafx недоступны, поэтому предположим худшее - не только не сихронизированно, но и каждый раз в новом потоке. Я бы в таких условиях содержимому переменных msg и x не доверял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 15:00 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
ivanraЯ бы в таких условиях содержимому переменных msg и x не доверял А, да. Но это отдельная тема. То что значения считаются как попало это да. Но с JavaFX проблема тоже остаётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 15:21 |
|
||
|
GUI + thread. Корректно ли ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz http://bugreport.java.com/bugreport/ Тут пишут: "For bug reports related to JavaFX, Please use the following site: JavaFX Bug Submissions to post and track reports related to JavaFX." Где по данной ссылке открывается уж что-то совсем непонятное, по крайней мере не нашел там, где можно отправить описание проблемы :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 17:40 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127388]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 475ms |

| 0 / 0 |
