![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Sergey912 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 3.1.2007 Репутация: нет Всего: нет |
Сделал программу, основная задача - работать с FTP. Подъсоеденяемся к удаленному серверу и с ним работаем.
Сделал основную форму, где находится IdFTP для работы с FTP, Memo для лога и кнопка. Нажал на кнопку - пошла загрузка. В самом потоке:
В форме:
Но когда я загружаю - все работает т.е. файлы загружаются, но форма тормозит по прежнему. Что я не так сделал? Файлов бывает много и мне нужно точно знать, что происходит и останавливать поток иногда и потом продолжать(это уже реализовано хранением слепка файлов на сервере, чтобы не обыскивать его самого постоянно). Что я не так делаю? Нужно было длительный процесс сделать работаюзим автономно и контролиремо и чтобы приложение вело себя нормально, а не превращалось в непонятно окно, где лог обновляется только в конце загрузки - значит правльно потоки использовал... но почему так работает? |
||||
|
|||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Ну а чего ты еще ждал от Synchronize? -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
1. убери свои извращения с потоком и кинь на форму TIdAntiFreeze. 2. Многопоточность - как это делается в Дельфи |
||||
|
|||||
| Sergey912 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 3.1.2007 Репутация: нет Всего: нет |
Это поможет от проблем избавится, которые есть без потоков т.е. вообще их убрать можно?
А вот нашел кое что кажется это уже ближе. А прервать ее как-то можно в таком состоянии без потерь? Для потока есть свои ф-и, а вот для того, чтобы докачать последний файл вывести в лог и добавить в слепок файлов на сервере - как это сделать т.е. чтобы по нажатию Stop эти вещи заканчивали работу и только потом прерывалась процедура? Это сообщение отредактировал(а) Sergey912 - 8.2.2007, 17:29 |
||||
|
|||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
хорошее описание. "прервать ее" - кого ее? что за "свои ф-ии для потока"? кто есть "слепок файлов"? какие "вещи" заканчивали работу?!. попробуй еще раз описать проблему и сделать это так, чтобы написанное было понятно не только тебе одному. |
|||
|
||||
| Sergey912 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 3.1.2007 Репутация: нет Всего: нет |
dumb,
загружаю файлы со своего компьютера на удаленный сервер. Если я уберу поток, то загрузка будет происходить по клику по кнопке т.е. заработает процедура закачки - это и есть "ее". Файлы закачиваются поочереди. Т.е. есть их список файлов и я каждый файл обрабатывают так, например наткнулись на папку:
Закачиваю на сервер файл, потом добавляю его через StrAddToFile - процедуру в файл слепок т.е. слепок - это точный список всех файлов на сервере, чтобы знать что туда загружено и не сканировать его при необходимости - гораздо проще прочитать текстовый файл. И последнее добавляю в Memo, чтобы было наглядно видно как идет процесс. Естественно файлов может быть очень много и мне иногда нужно остановить эту процедуру закачки. Я хочу сделать кнопку Stop или что-то в этом роде и остановить закачку файлов. Тогда мне надо, чтобы в зависимости от того, что сейчас делает процедура закачки она: Закончила закачивать текущий файл, добавила его в список файлов на сервере и вывела в Memo, а не остановилась после того как закачает файл т.к. будут проблемы: в моем списке файла нет, а на сервер закачан. |
|||
|
||||
| dumb |
|
||||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
Sergey912, судя по твоему описанию, тебе таки нужно вернуть назад работу с потоком, но избавить ее от извращений.
не поленись и прочитай таки статью, на которую тебе дали ссылку. приблизительно процедура Execute должна выглядеть так:
чтобы остановить "закачку", нужно просто грохнуть поток:
обрати внимание: поток должен быть в некотором смысле "оторван" от основной программы - т.е. все входные данные для его функционирования нужно поместить перед запуском внутрь класса TFtpUpload.
обращения к различным компонентам на форме делать через Synchronize. НО! нельзя всю работу запихивать туда, так как Synchronize останавливает рабочий поток, ждет пока ему дадут "войти" в основной поток(там, где рисуется форма, обрабатываются нажатия на кнопки итд) и там выполняет код указанной в его параметрах процедуры. пока выполняется эта процедура, все события формы "замирают". именно поэтому заключение всей работы потока внутрь Synchronize убивает смысл самого доп.потока. ps. IdFTP лучше создавать динамически в начале Execute. |
||||||
|
|||||||
| Sergey912 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 3.1.2007 Репутация: нет Всего: нет |
dumb,
Все сделал точно как ты говорил, только одна проблемка. После вызова Terminate - поток прерывается и даже файл недокачался, неговоря уже о записи в файл и выдаче в Memo.... Точно так же сделал все в while:
Это один из случаев, когда файл является файлом (не папкой) и когда его нужно закачать. Все прервалось в итоге файл на сервере 1500кб вместо положенных 1700 и не записан в файлик Все остальное тоже переделал, форма теперь трогается через процедуры, которые в Synchronize. Все перенес в поток, в форме ничего нет для работы потока нужного. Поток стартую и прерываю так, на одной кнопке:
Это сообщение отредактировал(а) Sergey912 - 11.2.2007, 03:19 |
||||
|
|||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
странно. возможно, это из-за анти-фриза.. без полного кода тяжело сказать определенно. (вообще говоря, анти-фриз этот нужен тогда, когда работа с "индейцами" идет из основного потока - они изнутри afair просто периодически Application.ProcessMessages вызывают, чтоб формы не умирали) можно попробовать вместо Terminated использовать какой-нибудь свой флажок(соотв. вместо Terminate просто устанавливать этот флаг) хм. косяки. при каждом нажатии создаешь TFtpUpload... сделай FtpProcess := nil где-нибудь при старте проги. а запускалку так:
|
||||
|
|||||
| Sergey912 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 3.1.2007 Репутация: нет Всего: нет |
Да это как бы и есть полный, не считая коннекта к БД и вызова процедуры обхода папки перед этим, а потом пошел цикл закачки...
Это тоже процедура, которая проверяет есть ли файл на сервере и что с ним делать... Вообще он из цикла просто выходит посередине, хз файл-т мог докачать хотя бы |
||||
|
|||||
![]()
|
| Правила форума "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. |