![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Проблема в том, что пока не выполнится FtpPutFile приложение не реагирует на внешние 'раздражители'. Сначала хотел показывать сколько байт передалось уже, но сам не осилил. Решил просто сделать таймер и прогресс бар, пусть заполняется и сбрасывается...Тоесть на событие OnTimer положил: if progressbar1.posiotion >=100 then progressbar1.position :=0; progressbar1.position := progressbar1.position + 5; Но когда программа доходит до выполнения процедуры FtpPutFile всё замирает и пока файл не будет скопирован заново работать не начинает. А копирование по модему не очень быстро происходит, как бы юзер не подумал что всё подвисло. Как решить? Может нужно использовать другие компоненты для копирования? P.S> Ссылка на FtpPutFile : http://forum.vingrad.ru/index.php?showtopic=102850 |
|||
|
||||
| Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Отдельный поток поможет.
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
c сетью нужно работать в потоках, или используй Indy
Это сообщение отредактировал(а) Akella - 6.7.2006, 11:13 |
|||
|
||||
| pavelv |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Если честно не сталкивался раньше с отдельными потоками, попробовал сделать и всё вылетает.
Не понимаю Synchronize вообще с чем должен синхронизировать и в каком месте мне нужно делать проверку на Terminated, я так понимаю она мне нужна. Сделал вот как:
Вроде всё как написана в инете |
||||
|
|||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Конечно TThread использовать правильнее, но не обязательно в этом случае. Тем более, как я заметил из твоего кода, ты не совсем понял как ОНО работает
Попробуй так:
Это сообщение отредактировал(а) Poseidon - 7.7.2006, 00:45 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Как отдельный поток он конечно запускается, но срабатывает через раз.
На 2 из 3 вылетает ошибка: показан лист CPU: THREAD #2800 7C81EB33 5E pop esi и ошибка компилятора: DEBUGER FAULT NOTIFICATION "PROJECT C:\..\project1.exe faulted with message:'application-defined exception (code 0x0eedfade) at 0x7c81eb33'". Process stoped Судя по тому, что раньше такого не возникало думаю дело как раз в потоках. |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
С каким кодом это происходит? Что делаешь при этом? Даешь-ли завершиться потоку (закачаться файлу) прежде чем запустить еще один поток?
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Я делаю всё как ты написал. Единственное отличие, что у меня после FtpPutFile вызывается ещё ShowMessage. А в параллельном потоке, тоесть на главной форме в процессе выполнения потока вызывается только OnTimer, который обращается к прогрессбару, чтобы пользователь видел работу приложения.
Вот мой код. Я думаю может дело в памяти, выделяется не правильно или ещё что? |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Synchronize нужно вызывать, когда обращаешься к VCL, например, чтобы не было конфликтов твоего потока с главным потоком VCL.
|
||||
|
|||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Я так понял, что использование CreateThread освобождает меня он Synchronize
Такой вопрос, а TReadBarCode.Execute в каком месте вызывать? Я ведь не пишу отдельный модуль с классом TThread. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
TReadBarCode.Execute вызываю при старте приложения
|
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Я конечно извиняюсь за то, что не спросил сразу...просто не пытался вызвать.
TReadBarCode, BarCodePort1 это что такое? //SetBarCodeForParentForm - процедура, которая обращается на форме к TEdit вы имеете ввиду процедуру которая выступает в качестве параллельного потока, copyBD в моем случае? P.S> Посмотрел кучу инфы на этом форуме и в инете, примеров использования синхрониз нету...видимо в всех так работало. |
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Пробовал BeginThread с теми же параметрами(правда h:=0 писал). Работает через раз. Когда не работает вылетает по ошибке:Project raised exception class EInvalidOperation with message "Canvas does not allow drawing"....
Иногда говорит: "Недопустимый дескриптор окна". |
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Всем спасибо за советы. Проблема заключалась именно в ShowMessage, его использование в параллельном процессе приводит к перегрузке ЦП. Я лично реализовал BeginThread, но проверил и CreateThread работает безотказно.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |