【发布时间】:2013-10-04 07:09:06
【问题描述】:
在 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 是异步处理消息的,所以有可能在调用它的时候,Log 字符串已经被销毁了。如何解决这个问题?
我想也许我可以在全局系统空间中分配字符串空间,然后将其传递给消息,然后TForm1.WMUpdateData处理消息后,它可以破坏全局空间中的字符串空间。这是一个可行的解决方案吗?如何实现?
谢谢
【问题讨论】:
-
看这里stackoverflow.com/questions/9932164/… 希望对你有帮助
-
您需要将您的 Log 变量声明为全局变量。
-
@S.MAHDI 不!如果有两条排队的消息怎么办?
-
考虑将这些字符串放在线程安全列表中,并将消息发回主线程,让其知道您添加了一个。
标签: multithreading delphi message postmessage