![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||