Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.01.2015, 12:37
Rusland Rusland вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 25
Репутация: 10
По умолчанию Можно ли IdFTP засунуть в поток?

Добрый день.
Подскажите, можно ли из потока обращаться к другим компонентам?
Могу ли я в своем потоке использовать, например, компонент idFTP для скачивания файлов? Если да, то как это делается?
Ответить с цитированием
  #2  
Старый 26.01.2015, 18:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

передай потоку ссылку на объект 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  
Старый 26.01.2015, 22:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не, лучше все-таки в потоке просто создать свой экземпляр компонента, а то придется синхронизацию писать...
Код:
procedure TMyThread.Execute;
var
  ftp : TIdFtp;
begin
  ftp := TIdFtp.Create(Nil);
  Try
    // Код использования
  Finally
    FreeAndNil(ftp);
  End;
end;

Кстати, если в классе потока много разных функций, обращающихся к данному компоненту, то лучше дествительно создавать его, компонент, в конструкторе и уничтожать в деструкторе.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Rusland (27.01.2015)
  #4  
Старый 27.01.2015, 10:34
Rusland Rusland вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 25
Репутация: 10
По умолчанию

Спасибо вам. Всегда помогаете.
Вчера решил эту проблему (как раз созданием idFTP внутри потока). Мне собственно хотелось скачивать с FTP несколько файлов одновременно.
Но как выяснилось в этом случае сервер иногда не справлялся с нагрузкой (некоторые потоки не могли скачать файл) из-за того что я создавал несколько потоков... пришлось использовать один поток с idFTP и скачивать файлы по очереди (зато программа не зависает ).
Еще раз спасибо, хоть немного начал разбираться в TThread

PS. Еще один вопросик остался (не хочется создавать новую тему): почему, если я создаю для потока отдельный юнит, то не могу достучаться до Form1 (и его компонентов соответственно)?

Последний раз редактировалось Rusland, 27.01.2015 в 10:36.
Ответить с цитированием
  #5  
Старый 27.01.2015, 11:37
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

>то не могу достучаться до Form1 (и его компонентов соответственно)?
После строки с текстом
Код:
implementation
напиши
Код:
implementation
uses
   Unit1;//или где там у тебя эта форма.
и не забудь, что менять чего либо на форме из потока можно только с использованием Synchronize
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Rusland (29.01.2015)
  #6  
Старый 27.01.2015, 16:56
Rusland Rusland вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
>то не могу достучаться до Form1 (и его компонентов соответственно)?
После строки с текстом
Код:
implementation
напиши
Код:
implementation
uses
   Unit1;//или где там у тебя эта форма.
и не забудь, что менять чего либо на форме из потока можно только с использованием Synchronize

Я ведь из главного юнита ссылаюсь на этот дочерний. Если я добавлю в дочерний uses Unit1; то произойдет зацикливание и проект не откомпилируется.
Ответить с цитированием
  #7  
Старый 27.01.2015, 18:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нет, не произойдет, если ты добавишь Form1 в секцию Implementation.

И еще ответ на твой вопрос по поводу потоков. Надо смотреть за кол-вом создаваемых потоков. Например, создавать не более 2-3 потоков на сайт. Кстати, скорее они просто "выжирают" всю пропускную способность твоего канала, а нормальный FTP серверс способен обслужить очень много клиентов.

Кстати, очень много потоков не любит и Винда, так что с этой точки зрения тоже лучше не увлекаться, хотя 20-30 потоков на приложение она нормально тянет, я не думаю, что ты уперся в этом месте.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Rusland (29.01.2015)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025