|
|
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Проблема: Программа при нажатии на кнопку начинает загружать файл и сохраняет его в нужную папку. Во время этой загрузки хотелось бы отображать статус загрузки (Сколько загружено/Сколько осталось загрузить), но никак не получается это реализовать, не хватает опыта (JAVA начал учить всего 10 дней назад). Исходный код Кнопка, при нажатии на которую начинается загрузка файла: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. - Тут проблема в том, что надпись "Начинается загрузка архива..." выводится только после загрузки файла, и всё это время пользователь думает что программа просто зависла. - И самое главное: Подскажите, пожалуйста, как можно во время загрузки файла можно вывести для пользователя хоть какую то информацию? Допустим я создал JProgressBar но никак не могу во время загрузки его изменять, ибо не знаю как, а если делать это в самом event'e то GUI просто зависает до времени пока файл не загрузится. Помогите, заранее большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2012, 21:32:08 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
TAXD, swingworker ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2012, 23:12:13 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
TAXD, посмотрите здесь http://www.java2s.com/Tutorial/Java/0240__Swing/SwingWorkerandProgressBar.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 02:28:11 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
Такую работу нужно делать в отдельном потоке. Иначе вполне логично вешаешь поток GUI. Если не умеешь работать в потоках - останавливай всю работу, иди изучай вопрос. Это ключевое знание, без него ты не программист. Потоки используются всегда и при любой потребности. На будущее: если тебе кажется, что где-то что-то висит - тупо логируй время (разницу от точки старта в мс) после каждой операции. Заведи отдельный статик-метод, заведи для него реакцию на какие-то тестовые данные, дабы он тебе потом не засрал боевые логи. Этим сэкономишь туеву хучу времени. Есть и много других методов. Но это - решение "в лоб", универсально. Особенно когда ошибка не в твоём коде. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 03:42:06 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
ResidentR6 Такую работу нужно делать в отдельном потоке. Иначе вполне логично вешаешь поток GUI. Если не умеешь работать в потоках - останавливай всю работу, иди изучай вопрос. Это ключевое знание, без него ты не программист. Потоки используются всегда и при любой потребности. Почему-то Java -программисты уверены, что на всё нужно обязательно создавать отдельный поток. Вообще-то для такой херни поток создавать -- идиотизм. А надо просто тупо заставить SWING перерисовать обновлённый контрол. Там есть какой-то PaintEvent, возможно надо послать и обработать его. Возможно, это непросто. Но это правильно. Возможно, можно как-то сначала запихать сообщение в контрол, потом поставить в очередь обработки событий событие типа "давай сделай ЭТО", и уже на обработке этого события, после того, как оно отрисует контрольчик, выполнять действие с файлом. Совет изучить работу с потоками конечно же правильный. Но для программирования GUI потоки почти не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 12:26:06 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
MasterZivСовет изучить работу с потоками конечно же правильный. Но для программирования GUI потоки почти не нужны. Вот по-моему очень даже нужны. Что касается Swing, то там основное правило, чтобы сделать "отзывчивый" интерфейс - всю долгую обработку выполнять в отдельном потоке, а не в Event Dispatch Thread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 14:53:59 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
Потоки нужны по-любому. Задача потоков не просто наплодить синхронизаций, а исключительно в ом, чтобы ОСВОБОДИТЬ поток, и выбросить задачу с зависимостями от внешних факторов - в отдельный поток. То же самое чтение файла - операция с диском в 1000 и более раз затратна по времени, чем та же операция с памятью. Про операцию с сетью и говорить не приходится. Ну не должен поток прорисовки ждать, пока сервак соизволит отдать данные, а сеть безошибочно их передать. За те NN секунд что комп ждёт ответа сети, юзер видит зависшую программу, и угадайте что с ней делает? Программист обязательно должен уметь освобождать потоки, перекладывая задачи в новый. А если работает со Swing - просто обязан на них молиться. Единственный момент - диалоговые окна, в частности выбора файла, надо открывать в потоке Свинга. А вот уже получив нужные данные, поднять прогресс бар и работать с файлом. Делается это элементарно. final File f = полученный от диалога файл; new Thread(){public void run( try{ try{ работа с файлом }finally{закрыть прогресс-бар; закрыть файл} }cacth(Throwable th){сообщить юзеру об ошибке} ){}}.start(); PS. Не забыть в новом потоке finally прибить прогресс бар, а также удостовериться что закрыли перед выводом сообщения эксепшена (иначе сообщение накроется прогрессбаром). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 16:56:34 |
|
||
|
GUI зависает при загрузке файла
|
|||
|---|---|---|---|
|
#18+
Спасибо всем кто помог, проблема решена. Точнее даже не проблема, а моё не знание :) Вот, если кому нужно будет, ещё статья по этому поводу + Сразу скажу, решение - SwingWorker, гуглите, обязательно найдёте: http://www.skipy.ru/technics/gui_sync.html#practics ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 18:00:47 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37833700&tid=2131597]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
31ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 341ms |
| total: | 484ms |

| 0 / 0 |
