Dephi では、このようなスレッドを作成し、メイン フォームに時々メッセージを送信します。
Procedure TMyThread.SendLog(I: Integer);
Var
Log: array[0..255] of Char;
Begin
strcopy(@Log,PChar('Log: current stag is ' + IntToStr(I)));
PostMessage(Form1.Handle,WM_UPDATEDATA,Integer(PChar(@Log)),0);
End;
procedure TMyThread.Execute;
var
I: Integer;
begin
for I := 0 to 1024 * 65536 do
begin
if (I mod 65536) == 0 then
begin
SendLog(I);
End;
End;
end;
ここで、WM_UPDATEDATA はカスタム メッセージで、以下に定義されています。
const
WM_UPDATEDATA = WM_USER + 100;
メインフォームでは、次のようにしてリストを更新します。
procedure TForm1.WMUpdateData(var msg : TMessage);
begin
List1.Items.Add(PChar(msg.WParam));
end;
ただし、メイン フォームに送信される Log 文字列はローカル変数であるため、SendLog を呼び出した後に破棄されます。TForm1.WMUpdateData はメッセージを非同期的に処理しますが、呼び出されたときにログ文字列がすでに破棄されている可能性があります。この問題を解決するには?
文字列スペースをグローバル システム スペースに割り当ててメッセージに渡すことができると思います。TForm1.WMUpdateData がメッセージを処理した後、グローバル スペースの文字列スペースを破棄できます。それは実行可能な解決策ですか?これを実装する方法は?
ありがとう