在我的 Delphi 项目中,我派生了一个线程类 TMyThread,并按照论坛的建议使用 AllocateHWnd 创建窗口句柄。在 TMyThread 对象中,我调用 SendMessage 将消息发送到窗口句柄。
当发送的消息量较小时,应用程序运行良好。但是,当消息量很大时,应用程序会死锁并失去响应。我认为可能是 LogWndProc 中的消息队列已满,只有处理消息的代码,但没有从队列中删除消息的代码,这可能导致所有已处理的消息仍然存在于队列中并且队列已满. 那是对的吗?
代码附在下面:
var
hLogWnd: HWND = 0;
procedure TForm1.FormCreate(Sender: TObject);
begin
hLogWnd := AllocateHWnd(LogWndProc);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if hLogWnd <> 0 then
DeallocateHWnd(hLogWnd);
end;
procedure TForm1.LogWndProc(var Message: TMessage);
var
S: PString;
begin
if Message.Msg = WM_UPDATEDATA then
begin
S := PString(msg.LParam);
try
List1.Items.Add(S^);
finally
Dispose(S);
end;
end else
Message.Result := DefWindowProc(hLogWnd, Message.Msg, Message.WParam,
Message.LParam);
end;
procedure TMyThread.SendLog(I: Integer);
var
Log: PString;
begin
New(Log);
Log^ := 'Log: current stag is ' + IntToStr(I);
SendMessage(hLogWnd, WM_UPDATEDATA, 0, LPARAM(Log));
Dispose(Log);
end;