Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Вопрос по потокам: создание компопнента в потоке   Найти похожие ветки 

 
ilgam ©   (2004-07-23 10:09) [0]

Уважаемые помогите пожалуйста. Я создаю в каждом потоке создаю новую компоненту. Так как с потоками я впервые столкнулся, то очень трудно понять как сделать следующее.
Есть следующий код программы:

TRegThread = class(TThread)
 private
 public
    thrRegPass : String;
    ftp1:TFtpClient;
    constructor CreateThread;
    procedure   Execute ; override;
    procedure   ErrorFtp(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String);
    procedure   ConnectFailed(Sender: TObject);
 end;
....

constructor TRegThread.CreateThread;
begin
    FreeOnTerminate := TRUE;
    inherited Create(FALSE);
end;
....

procedure TRegThread.Execute;
begin
   ftp1                          := TFtpClient.Create(nil);
   ftp1.ConnectionTimeout        := 17;
   ftp1.ProxyAuth                := False;
   ftp1.ProxyPass                := "";
   ftp1.ProxyResolve             := False;
   ftp1.ProxyUserID              := "";
   ftp1.ProxyType                := P_HTTP;
   ftp1.OnError                  := Errorftp;

   ftp1.ProxyHost                := proxyIP;
   ftp1.ProxyPort                := proxyPort;
   ftp1.FtpPort                  := 21;
   ftp1.UserName    := login;
   ftp1.Password                 := password;

   ftp1.Connect;
end;

procedure TRegThread.ErrorFtp(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String);
begin
Form1.Memo1.Lines.Add("Error: " + ErrorMsg);
!!!Вот здесь встала проблема, я бы хотел добавить в Memo1 также тот логин и пароль от фтп которые стали причиной этой ошибки,
но так как переменные login и password в программе глобальные
и с каждым новым потоком они разные, а мне надо именно тот логин с паролем который и вызвал эту процедуру. Также не пойму теперь как из этой процедуры обратится именно к тому ftp1 который был создан в потоке. Наверняка я тут много чего делаю не верно, очень вас прошу помоч мне с этим, если это возможно то покажите исправленный код этой программы. Если необходимо то даже готов заплатить. просто срочность большая.

end;


 
Reindeer Moss Eater ©   (2004-07-23 10:13) [1]

Делай логин и пароль полями или свойствами класса своего потока


 
han_malign ©   (2004-07-23 10:32) [2]

>обратится именно к тому ftp1
- TFtpClient(Sender)
только все равно это не поможет - после создания ftp1, поток сразу уничтожается(это и по поводу "свойствами класса своего потока"), а я так думаю(не знаю как работает TFtpClient), что надо-бы еще и опрос состояния делать, одними ошибками жив не будешь....


 
ilgam ©   (2004-07-23 10:33) [3]

Да пытался уже.
на примере пароля делал.
добавил в класс TRegThread строку
thrPass : String; таким образом

TRegThread = class(TThread)
private
public
   thrPass : String;
...

далее

procedure TRegThread.Execute;
begin
  ftp1                          := TFtpClient.Create(nil);
...
  ftp1.OnError                  := Errorftp;
...
  ftp1.Password                 := password;
 
  thrPass := password;

  ftp1.Connect;
end;

Ну и самое главное
procedure TRegThread.ErrorFtp(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String);
begin
Form1.Memo1.Lines.Add("Error: " + ErrorMsg);
Form1.Memo1.Lines.Add(thrPass);
end;

В такое случае прога компилируется, а как только срабатывает эта последняя процедура и доходит до строки Form1.Memo1.Lines.Add(thrPass) то прога выкидывает Access Violation, при отладке вижу что thrPass в этой процедуре имеет inaccessible value.
Может я не так чтото понял? помогите, желательно сам код, я пока новичек.


 
han_malign ©   (2004-07-23 10:58) [4]

>то прога выкидывает Access Violation
- естественно выкидывает, потому что, ЕЩЕ РАЗ ПОВТОРЮ, к этому моменту TRegThread уже уничтожен(рабочий цикл потока завершен(Execute), и FreeOnTerminate := TRUE).
Метод статический, поэтому callback проходит, а вот self, и соответственно self.thrPass - уже уничтожены.

IMHO: И вообще, судя по наличию асинхронных callback-ов, у TFtpClient уже есть свой поток, и лишние городить не нужно, особенно если не знаете как это делается...


 
ilgam ©   (2004-07-23 11:12) [5]

Хех, вы бы так сразу и сказали. Я же говорю что в потоках я вообще никакой и скопировал это просто из похожей проги, вот потихоньку начинаю понимать.
Убрал строку FreeOnTerminate := TRUE и теперь пароль и логин остаются живы и можно их добавлять в мемо1. спасибо огромное han_malign.
Но вопрос /именно к тому ftp1/ пока для меня не ясен.


 
han_malign ©   (2004-07-23 11:44) [6]

procedure   ErrorFtp(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String);
procedure   ConnectFailed(Sender: TObject);

Lingvo: sender - отправитель (сообщений)

procedure TRegThread.ErrorFtp(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String);
begin
.......
 if(Sender is TFtpClient)then TFtpClient(Sender)...


 
ilgam ©   (2004-07-23 11:54) [7]

han_malign спасибо за терпение ;)



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.059 c
6-1086428501
Dennisius
2004-06-05 13:41
2004.08.08
StatusBar в TWebbrowser


6-1086867946
_ice_
2004-06-10 15:45
2004.08.08
WNetCancelConnection2


14-1090201971
Думкин
2004-07-19 05:52
2004.08.08
С днем рождения! 19 июля


1-1090474367
SkyP
2004-07-22 09:32
2004.08.08
как создать объект по имени класса ?


8-1085246749
Dr.Alex
2004-05-22 21:25
2004.08.08
MPEG to AVI