私の 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;