Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.044 c
3-1089812407
qwer
2004-07-14 17:40
2004.08.08
округление и sql


1-1090933296
Phoenix
2004-07-27 17:01
2004.08.08
Сортировка в ListView


14-1090309262
<DeL.>
2004-07-20 11:41
2004.08.08
Счетчик


14-1090438685
k@rt
2004-07-21 23:38
2004.08.08
Winamp + 5 колонок


9-1082991903
If
2004-04-26 19:05
2004.08.08
Как курсор на ВКЛ форме свой поставить?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский