![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по потокам: создание компопнента в потоке [D7, Win2k, WinXP]
ilgam © (2004-07-23 10:09:00)Уважаемые помогите пожалуйста. Я создаю в каждом потоке создаю новую компоненту. Так как с потоками я впервые столкнулся, то очень трудно понять как сделать следующее.
Есть следующий код программы:
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;
ilgam (2004-07-23 11:54:00) [1]han_malign спасибо за терпение ;)
han_malign (2004-07-23 11:44:00) [2]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:12:00) [3]Хех, вы бы так сразу и сказали. Я же говорю что в потоках я вообще никакой и скопировал это просто из похожей проги, вот потихоньку начинаю понимать.
Убрал строку FreeOnTerminate := TRUE и теперь пароль и логин остаются живы и можно их добавлять в мемо1. спасибо огромное han_malign.
Но вопрос /именно к тому ftp1/ пока для меня не ясен.
han_malign (2004-07-23 10:58:00) [4]> то прога выкидывает Access Violation
- естественно выкидывает, потому что, ЕЩЕ РАЗ ПОВТОРЮ, к этому моменту TRegThread уже уничтожен(рабочий цикл потока завершен(Execute), и FreeOnTerminate := TRUE).
Метод статический, поэтому callback проходит, а вот self, и соответственно self.thrPass - уже уничтожены.
IMHO: И вообще, судя по наличию асинхронных callback-ов, у TFtpClient уже есть свой поток, и лишние городить не нужно, особенно если не знаете как это делается...
ilgam (2004-07-23 10:33:00) [5]Да пытался уже.
на примере пароля делал.
добавил в класс 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:32:00) [6]> обратится именно к тому ftp1
- TFtpClient(Sender)
только все равно это не поможет - после создания ftp1, поток сразу уничтожается(это и по поводу " свойствами класса своего потока"), а я так думаю(не знаю как работает TFtpClient), что надо-бы еще и опрос состояния делать, одними ошибками жив не будешь....
Reindeer Moss Eater (2004-07-23 10:13:00) [7]Делай логин и пароль полями или свойствами класса своего потока