私はDelphi 2007とスレッドを使用しています。イベントとシェア変数の作成
私の問題(申し訳ありませんが、私はより良い説明しようとするでしょう):
1)私は、私はより多くを使用する機能を持っているファイル「utilities.pas」を作成しました。 2)新しいプログラムを作成しました。このプログラムには1つのスレッドがあります。 3)スレッドの実行メソッドで、私のファイル "utilities.pas"に1つの関数を呼び出します。 この機能は、巧妙なコンポーネント(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"はスレッド内で実行されますか?もしそうなら、それを明確にすべきです。 –