我正在使用Delphi 2007和線程。創建事件和共享變量
我的問題(對不起,我會試着解釋更好):
1)我創建了一個文件「utilities.pas」在那裏我有我使用更多的功能。 2)我創建了一個新程序,在這個程序中我有一個線程 3)在線程的執行方法中,我在文件「utilities.pas」中調用一個函數。 這個函數使用聰明的組件(tclftp)連接到一個ftp。這些組件記錄服務器在專用事件中的響應。我想要做的是將日誌保存在一個字符串列表中,然後將該字符串列表發送回調用線程。
這是文件的一部分 「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.感謝所有的答案..
錯字:slMail應該是:slMain –
我認爲你需要調用cFTP.Open後做slMain什麼?如果是這樣,你應該發表評論。否則,正如所寫,slMain是無關緊要的。 –
程序「Test」是否在線程中運行?如果是這樣,你應該說清楚。 –