|
|
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Кажется, проблема та же, что и в http://sql.ru/forum/actualthread.aspx?tid=226749 Объясните, пожалуйста, почему при модальном JDialog приложение зависает, а при немодальном работает нормально. Что там происходит с потоками? Можно ли оставить JDialog модальным и получить нужный мне результат? Вот тестовый код: Код: plaintext 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. 103. 104. 105. 106. 107. 108. 109. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 11:39 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
не совсем понятно, что вообще нужно, но, я немного переделал код и диалог ведет себя так, как и должен, все что закоментировал, нафиг не нужно. При чем поведение диалога правильное когда он модалный и не модальный. Код: plaintext 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. 103. 104. 105. 106. 107. 108. 109. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 12:01 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
to wessen: Во-первых, можно быть и повежливее. (Это по поводу "нафиг не нужно"). Во-вторых, это тестовый код, чтобы проверить работу потоков. В оригинале приложение намного сложнее. Потоки мне здесь необходимы. Поэтому, чтобы не морочить людям голову огромным количеством кода, я сделала тест, который выявляет суть проблемы. В-третьих, хотелось бы получить ответ на поставленный вопрос относительно потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 12:12 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
yelenaКажется, проблема та же, что и в http://sql.ru/forum/actualthread.aspx?tid=226749 Объясните, пожалуйста, почему при модальном JDialog приложение зависает, а при немодальном работает нормально. Что там происходит с потоками? Можно ли оставить JDialog модальным и получить нужный мне результат? Вот тестовый код: А какой вообще результат ожидается от этого кода? после Код: plaintext приложение ждет когда вы закроете диалог, он ведь модальный. а закрыть низя ибо синхронайзд по этому же диалогу ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 13:09 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Спасибо, вот уже что-то, хотя не совсем понятно. Если можно, то, пожалуйста, подробнее про зависимость закрытия от синхронайзд в случае с модальностью. Ведь в синхронизированном методе я закрываю диалоговое окно. Результат хотелось бы получить такой же, как и в случае, если диалоговое окно не является модальным, т.е. поменять текст во фрейме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 13:23 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Зачем запускать диалог в отдельном потоке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 13:37 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
to wessen: Затем, что в оригинале у меня в приложении одновременно могут выполняться несколько потоков. В одном из них из диалога нужно получить данные для нормального продолжения работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 13:53 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
yelenato wessen: Затем, что в оригинале у меня в приложении одновременно могут выполняться несколько потоков. В одном из них из диалога нужно получить данные для нормального продолжения работы. мне кажется, что вы неверно выбрали способ взаимодействия потоков и диалога. "... из диалога нужно получить данные.. " - ну так создайте нормально диалог, затем создавайте нормально потоки и передавайте в них ссылки на диалог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 14:03 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
yelenaСпасибо, вот уже что-то, хотя не совсем понятно. Если можно, то, пожалуйста, подробнее про зависимость закрытия от синхронайзд в случае с модальностью. Ведь в синхронизированном методе я закрываю диалоговое окно. Результат хотелось бы получить такой же, как и в случае, если диалоговое окно не является модальным, т.е. поменять текст во фрейме. Ну запуская модальный диалог в синхронайзд, вы вешаете поток до того как диалог закроецца, а закрываецца он уже из другого потока (должен закрывацца :)). Но другой поток его закрыть не может, так как метод который закрывает тоже синхронайзд и находицца в классе по объекту которого уже стоит синхронайзд :)) можно вынести имплементацию акшнлистенера в отдельный класс, тогда дедлока не будет. и еще, зачем там wait()? я чегото не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 14:49 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. Так правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 14:59 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
to Guest_2: Да. Так правильно. Если диалог не модальный, то без синхронизации и wait нужного результата получить не удается. Ну а если он модальный, то действительно не нужно ни синхронизации, ни wait. Большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 15:29 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Все же хотелось бы продолжить разговор о поведении потоков. Когда Jozic написал "Ну запуская модальный диалог в синхронайзд, вы вешаете поток до того как диалог закроецца, а закрываецца он уже из другого потока (должен закрывацца :)). Но другой поток его закрыть не может, так как метод который закрывает тоже синхронайзд и находицца в классе по объекту которого уже стоит синхронайзд :))", наверное, он имел в виду следующее: "Если поток блокируется тогда, когда он сам блокирует объект, то в таком случае блокируется каждый поток, вызывающий синхронизированный метод для этого объекта". Возвращаясь к моему тестовому примеру. Возникает первый вопрос: в связи с чем был заблокирован поток, блокирующий диалоговое окно? И второй вопрос: если в отладчике JBuilder'а поставить контрольные точки на myDialog.setVisible(true); и на myDialog.wait(); и на notify(); и запустить отладчик, то в результате видим, что notify и wait отрабатывают раньше, чем setVisible. C чем это связано? Ведь кнопку в диалоговом окне я еще не нажимала (оно еще не появилось). Поэтому как может отработать notify? И что срабатывает раньше: notify или wait? И как это влияет на дальнейшее поведение потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 14:34 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Если поток был блокирован при вызове wait, то поток то блокируется, а объект освобождается. И другие потоки могут им воспользоваться. Чего-то я здесь не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 14:40 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
Ленусик, еще раз скажу, грешное это дело создовать диалог в потоке, не делайте так никогда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:09 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
ну, уж не знаю, как ласково обратиться мне известно о проблемах взамодействия Swing c потоками только ведь хочется разобраться, что происходит в моем тестовом примере всего лишь сейчас вопрос правильности или неправильности меня уже не интересует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:14 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
yelena ... наверное, он имел в виду следующее: "Если поток блокируется тогда, когда он сам блокирует объект, то в таком случае блокируется каждый поток, вызывающий синхронизированный метод для этого объекта". Я иммел ввиду следующее: Поток не блокируется когда блокирует объект, а блокируется он когда вызываецца модальный диалог. Но в тоже время блокировка по объекту, не дает другому потоку выполнить синхронайзд метод класса, инстансом которого являецца блокированный объект. Вот :). В вашем случае это метод акшнлистенера, который закрывает диалог. Как я уже говорил, если этот метод вынести в другой класс, то взаимной блокировки не будет yelena Возвращаясь к моему тестовому примеру. Возникает первый вопрос: в связи с чем был заблокирован поток, блокирующий диалоговое окно? Только что написал :) yelena И второй вопрос: если в отладчике JBuilder'а поставить контрольные точки на myDialog.setVisible(true); и на myDialog.wait(); и на notify(); и запустить отладчик, то в результате видим, что notify и wait отрабатывают раньше, чем setVisible. C чем это связано? Ведь кнопку в диалоговом окне я еще не нажимала (оно еще не появилось). Поэтому как может отработать notify? И что срабатывает раньше: notify или wait? И как это влияет на дальнейшее поведение потоков? Это у вас Жбилдер чето врет :), такой ситуации у меня не было. Ставил брейкпоинты, все срабатывает как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:25 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
в вашем примере(оторваном от реальности), в любом случае нужно пожертвовать каким нибудь синхронайзем, например так: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:32 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
wessenв вашем примере(оторваном от реальности), в любом случае нужно пожертвовать каким нибудь синхронайзем, например так: Можно пожертвовать, а можно и не жертвовать (в случае с вынесением метода в отдельный класс :)) но нужно подумать нужна ли там синхронизация вообще :) а насчет вейтов и нотифаев я все равно не понял, зачем они там были нужны :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:47 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
to Jozic: ну, если JBuilder врет, то не у меня одной :) и, насколько я понимаю, поток у меня блокируется свинговым потоком управления событиями при визуализации модального диалога ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:48 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
да сначала у меня диалог немодальный был от него wait и notify остались когда я диалог модальным сделала, они стали не нужны я просто с переходом на модальность немного запуталась и не убрала их сразу кажется, теперь все встало на свои места ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:52 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
yelenato Jozic: ну, если JBuilder врет, то не у меня одной :) Незнаю, может быть :) Я использовал ИДЕЮ, брейкпоинты сработали как и должно быть. yelena и, насколько я понимаю, поток у меня блокируется свинговым потоком управления событиями при визуализации модального диалога Не знаю точно как оно все реализовано в деталях, но блокировка происходит благодаря модальному диалогу. пока диалог не закрыт, текущий поток управления дальше не пойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 16:56 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
авторМожно пожертвовать, а можно и не жертвовать (в случае с вынесением метода в отдельный класс :)) но нужно подумать нужна ли там синхронизация вообще :) Вынести метод в др. класс, это будет то же самое, что его оставить на месте, но сделать не синхронезированным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 17:56 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
wessen авторМожно пожертвовать, а можно и не жертвовать (в случае с вынесением метода в отдельный класс :)) но нужно подумать нужна ли там синхронизация вообще :) Вынести метод в др. класс, это будет то же самое, что его оставить на месте, но сделать не синхронезированным. В данном конкретном случае результат одинаковый, а так позволю себе не согласицца :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2005, 19:06 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
и с чем ты не согласен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2005, 11:17 |
|
||
|
Потоки и модальность JDialog
|
|||
|---|---|---|---|
|
#18+
wessenи с чем ты не согласен? С вашим высказыванием :) wessenВынести метод в др. класс, это будет то же самое, что его оставить на месте, но сделать не синхронезированным синхронайзд метод наверное ведь отличается от не синхронайзд, а? :) Вынесение метода в другой класс, являецца своего рода рефакторингом, который не скажецца на том, что данный метод доступен для выполнения только одному потоку в конкретный момент времени. Я согласен, что в данном конкретном примере, это решает проблему, но возможно синхронайзд там действительно нужен по каким либо причинам и убрать его нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2005, 12:41 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=774&tid=2151168]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
96ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 364ms |

| 0 / 0 |
