Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Сети > IdFTP - подвисает при закачке |
Автор: inside 21.7.2006, 23:26 | ||
Ребят, извините, если вопрос глупый. Считаю в процентах кол-во закаченного файла.
max_bytes - общий размер файла Вот только со временем, при закачке большого файла - прога виснет, но по завершении закачки отвисает. Как решить проблему? |
Автор: Nickey 22.7.2006, 00:44 |
ЭЭЭ,в отдельный поток может ее пихнуть? |
Автор: Matematik 22.7.2006, 13:10 |
Поиграй настройками антифриза |
Автор: inside 22.7.2006, 19:43 |
А что такое антифриз? Не слышал про это =( В отдельный поток засунуть поможет? |
Автор: Snowy 23.7.2006, 13:54 |
Просто найди TIdAntifreeze, брось его на форму. |
Автор: inside 27.8.2006, 20:40 | ||
Всем ещё раз привеееет =))) Народ, я поробовал AntiFreeze - ничего не получилось - прочитал, что он подтормаживает.. Решил поэтому сделать отдельным потоком.. Вроде нормально получилось, вот только такой вопрос - как теперь обработать события OnWork & OnWorkBegin & OnWorkEnd...???? ![]() Дело в том, что я хочу отслеживать процесс закачки.. Кстати - в новом процессе я использую такой код. Всё ли правильно?!
Пробовал просто приравнять их к процедурам - обработчикам событий. если писать через VCL... Но говорит о несовпадении типов TNotifyEvent & procedure ![]() |
Автор: Snowy 27.8.2006, 21:44 | ||
Правильно. Потому что процедура должна быть с параметром:
|
Автор: inside 27.8.2006, 22:47 |
А если параметры оставить те же, что и в обработчиках событий в VCL: procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); они передадутся в резльтате такого равенства: ftp.OnWork=IdFTP1Work???? только вот ещё проблема в том, что компилятор не понимает, что такое AWorkMode.... Где есть эта запись? Спасибо!! ![]() |
Автор: Snowy 27.8.2006, 22:59 |
Именно. При присваивании событию, обработчик должен иметь параметры, соответствующие ожидаемых компонентом. При этом имена переменных могут отличаться - главное количество, порядок и тип параметров. TWorkMode находится в IdComponent. |
Автор: inside 27.8.2006, 23:19 |
Snowy, блииииииин, точняяяяяк =))) Спасибо огромное! Побежал пробовать |
Автор: inside 29.8.2006, 13:07 | ||
ну в общем я оформил новый поток:
Но что-то программа всё равно подвисает.. Цыферки в статус баре один то обновляются, то подвисают. Само окно вообще всё виснет. В чём косяк. Где я напортачил? ![]() |
Автор: Snowy 29.8.2006, 13:32 |
А зачем ты аплод запихал в синхронизацию? Так он у тебя в основном потоке работать будет. Просто вызови его. Иначе смысла в треде никакого. |
Автор: inside 29.8.2006, 13:35 |
![]() ![]() ![]() А в синхронизацию запихать только обновление статус бара????? ![]() ээээ.. вот только как это сделать?! Ведь обработчики событий тогда буду вызываться в другом потоке... а оттуда нет доступа к элементам VCL... |
Автор: Snowy 29.8.2006, 14:02 |
Сделай ещё одну процедуру для обновления контролов и вызывай её синхронизацией из OnWork. Добавлено @ 14:03 Вообще-то доступ есть... Просто не рекомендуется его юзать. Но и не запрещено... |
Автор: inside 29.8.2006, 22:20 |
Точняк - всё сделал и всё работает отлично... Но... вот ещё один вопросец... ![]() У меня происходит закачка файла... я хочу сделать возможность её отмены.. Но часть файла уже закачивается на сервер и я хочу сделать, чтобы при нажатии отмены этот кусок удалялся. При нажатии отмены я вызываю метод Terminate. Вот только как мне обработать закрытие и удалить файл - ведь Terminated я не могу проверять, разве что в событии OnWork... (Если можно там, то можно ли просто взять и из этой процедуры удалить файл и закрыть поток?! ![]() |
Автор: Snowy 30.8.2006, 09:27 |
Удаляй в Thread.Execute, если есть флаг Terminated/ После вызова Upload. |
Автор: inside 30.8.2006, 10:04 | ||
Но ведь тогда у меня сначала закачается файл полностью, а потом я его удалю. А мне надо отменить закачку в процессе. Execute такой
Если я проверю свойство Terminated после Put, то у меня наверное сначала файл закачается, а потом уже отмена произойдет. Верно. Ещё раз спрошу - может можно в методе OnWork? |
Автор: Snowy 30.8.2006, 10:07 |
Сделай Abort ![]() |
Автор: inside 31.8.2006, 17:43 | ||
Не получаеться =((( вот процедура
когда посылаешь команду Thread.Terminate не появляется никакое сообщение... Если ShowMessage('Proccess killed!') поставить перед ftp.Abort то появляется => ftp.Abort провоцирует какую-то ошибку.... =(( Что делать, Snowy? |