|
Грабли в аплете с отдельным потоком
|
|||
---|---|---|---|
#18+
Привет всем!!! У меня грабли с аплететом, который имеет отдельный поток. Отдельный поток управляет перерисовкой анимации. В данном случае это набор произвольных прямоугольников разного цвета. Проблемы: 1)Хочу чтобы поток останавливался при сворачивании окна броузера и продолжал работу при его разворачивании. По логике надо использовать метода start, stop аплета и соответствующие методы потока. Может быть вместо метода stop лучше использовать метод interrupt?!! Грабли №1. 2)При нажатии любой клавиши, чтобы поток останавливался, а при повторном вновь продолжал работать. Для этого я написал метод listnerControl. Проблема - после его вызова поток уже никогда не стартует :-((( И чего я только не делал (плачу горькими слезами...) Грабли №2 При тестированнии сего экзЯмпляра (если кто на это решиться), не забудьте перед нажатием кнопки клавиатуры передать фокус на аплет щелчком мышки. Код: 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.
Для ленивых даже HTML-файл: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2004, 19:05 |
|
Грабли в аплете с отдельным потоком
|
|||
---|---|---|---|
#18+
getGraphics() вызывается не оправданно, в конце концов схлопочешь NullPointerException, когда юзер будет релоадить страницу :) В методе repaintApplet() вместо getGraphics().drawImage(buffer, 0, 0, width1, height1, this); должен стоять repaint(); Так же, было бы разумным взять в synchronized() блок часть кода, где перерисовывется buffer. Маловероятно, что метод paint(g) будет вызван в этот промежуток времени, но от греха по дальше :) Реализация обработки interrupt() лежит на авторе приложения. Поэтому если решил им пользоваться, то и обрабатывай правильно. Собственно, раз метод stop() стал deprecated, то другого выхода и нет :) Можно таким образом: Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Но самое забавное, что повторные вызовы метода start() не будут вызывать метод run() :) Нет времени проверять баг это или фича под разными JDK, но раз так себя ведёт 1.4.2_04, то придётся это поддерживать :) Самый простой подход создавать заново Thread и запускать его, вместо старого. Правда, можно не использовать все эти start/stop/interrupt, а реализовать класс Thread расширив его методами stopRepaint/startRepaint/stopThread и реализовав эту логику в методе run(); public void stopRepaint() { repaint = false; } public void startRepaint() { repaint = true; } вместо repaintApplet(); if (reapint) repaintApplet(); public void stopThread() { interrupt(); } ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2004, 12:37 |
|
Грабли в аплете с отдельным потоком
|
|||
---|---|---|---|
#18+
СПАСИБО!!! 1)NotGonnaGetUs,Вы правы насчет исключения при релоде страницы. Я то не как не мог понять, откуда ноги растут. 2)при вызове repain всегда происходит прорисовка фона изображения, отсюда мерцание при анимации... Может есть какие-либо идеи, как боротся с прорисовкой фона аплета? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2004, 13:33 |
|
|
start [/forum/topic.php?fid=59&gotonew=1&tid=2154076]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 468ms |
0 / 0 |