Я использую Delphi 2007 и потоки.
Моя проблема (извините, я постараюсь объяснить лучше):
1) Я создал файл "utilities.pas", где у меня есть функция, которую я использую больше.
2) Я создал новую программу, в этой программе у меня есть один поток
3) в методе выполнения потока я вызываю одну функцию в моем файле "utilities.pas".
Эта функция подключается к FTP с использованием умных компонентов (tclftp). Эти компоненты регистрируют ответ сервера в выделенном событии. То, что я хотел бы сделать, это сохранить журнал в списке строк и затем отправить список строк обратно в вызывающий поток.
Это часть файла "utilities.pas":
// I created TEventHandlers because it's the only way to assign the event runtime
// without having a class
type
TEventHandlers = class
procedure clFtp1SendCommand(Sender: TObject; const AText: string);
end;
var EvHandler: TEventHandlers;
// this is the porcedure called from the thread. i want to send the stringlist
// back to it containing the ftp log
procedure Test(VAR slMain: tStringlist);
var cFTP: TclFtp;
begin
cFTP := TclFtp.Create(nil);
cFTP.Server := 'XXX';
cFTP.UserName := 'XXX';
cFTP.Password := 'XXX';
cFTP.OnSendCommand := EvHandler.clFtp1SendCommand;
// i connect to the ftp
cFTP.Open;
FreeAndNil(cFTP);
end;
procedure TEventHandlers.clFtp1SendCommand(Sender: TObject; const AText: string);
begin
// here the component (cftp) sends me back the answer from the server.
// i am logging it
// HERE IT'S THE PROBLEM:
// I can't reach slMain from here.....
slmain.add(Atext);
end;
это вызывающая нить:
procedure TCalcThread.Execute;
var slMain: tstringlist;
begin
inherited;
slmain := tstringlist.create(nil);
Test(slmain);
if slMain.count > 0 then
slMain.savetofile('c:\a.txt');
// i won't free the list box now, but in the thread terminated.
end;
это основная программа:
procedure TfMain.ThreadTerminated(Sender: TObject);
Var ExThread: TCalcThread;
begin
ExThread := (Sender as TCalcThread);
if ExThread.slMain.Count > 0 then
ExThread.slMain.SaveToFile('LOG\Errori.log');
freeandnil(slMain);
end;
Пожалуйста, кто-нибудь может мне помочь в решении этого? Я действительно не знаю, что делать.
Я надеюсь, теперь это более ясно.
p.s. спасибо за весь ответ ..