Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизВопрос по потокам: создание компопнента в потоке Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c