![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день.
Подскажите, можно ли из потока обращаться к другим компонентам? Могу ли я в своем потоке использовать, например, компонент idFTP для скачивания файлов? Если да, то как это делается? |
#2
|
||||
|
||||
![]() передай потоку ссылку на объект TIdFTP:
Код:
type TMyThread = class(TThread) private FIdFTP: TIdFTP; protected procedure Execute; override; public constructor Create(AIdFTP: TIdFTP); end; ... { TMyThread } constructor TMyThread.Create(AIdFTP: TIdFTP); begin FIdFTP:=AIdFTP; inherited Create(False); end; procedure TMyThread.Execute; begin FIdFTP.Port:=2015; end; Код:
procedure TForm1.FormCreate(Sender: TObject); begin TMyThread.Create(IdFTP1); end; Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Rusland (27.01.2015)
|
#3
|
|||
|
|||
![]() Не, лучше все-таки в потоке просто создать свой экземпляр компонента, а то придется синхронизацию писать...
Код:
procedure TMyThread.Execute; var ftp : TIdFtp; begin ftp := TIdFtp.Create(Nil); Try // Код использования Finally FreeAndNil(ftp); End; end; Кстати, если в классе потока много разных функций, обращающихся к данному компоненту, то лучше дествительно создавать его, компонент, в конструкторе и уничтожать в деструкторе. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Rusland (27.01.2015)
|
#4
|
|||
|
|||
![]() Спасибо вам. Всегда помогаете.
Вчера решил эту проблему (как раз созданием idFTP внутри потока). Мне собственно хотелось скачивать с FTP несколько файлов одновременно. Но как выяснилось в этом случае сервер иногда не справлялся с нагрузкой (некоторые потоки не могли скачать файл) из-за того что я создавал несколько потоков... пришлось использовать один поток с idFTP и скачивать файлы по очереди (зато программа не зависает ![]() Еще раз спасибо, хоть немного начал разбираться в TThread PS. Еще один вопросик остался (не хочется создавать новую тему): почему, если я создаю для потока отдельный юнит, то не могу достучаться до Form1 (и его компонентов соответственно)? Последний раз редактировалось Rusland, 27.01.2015 в 10:36. |
#5
|
|||
|
|||
![]() >то не могу достучаться до Form1 (и его компонентов соответственно)?
После строки с текстом Код:
implementation Код:
implementation uses Unit1;//или где там у тебя эта форма. |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Rusland (29.01.2015)
|
#6
|
|||
|
|||
![]() Цитата:
Я ведь из главного юнита ссылаюсь на этот дочерний. Если я добавлю в дочерний uses Unit1; то произойдет зацикливание и проект не откомпилируется. |
#7
|
|||
|
|||
![]() Нет, не произойдет, если ты добавишь Form1 в секцию Implementation.
И еще ответ на твой вопрос по поводу потоков. Надо смотреть за кол-вом создаваемых потоков. Например, создавать не более 2-3 потоков на сайт. Кстати, скорее они просто "выжирают" всю пропускную способность твоего канала, а нормальный FTP серверс способен обслужить очень много клиентов. Кстати, очень много потоков не любит и Винда, так что с этой точки зрения тоже лучше не увлекаться, хотя 20-30 потоков на приложение она нормально тянет, я не думаю, что ты уперся в этом месте. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Rusland (29.01.2015)
|