Meine Anwendung hat mehrere Themen: 1) Haupt-Thread 2) 2 Sub-Main Threads (jeweils mit Message Loop, wie unten gezeigt), von TFQM verwendet 3) n Worker Threads (einfach Schleife, enthält Sleep())Delphi Multi-Threading Nachricht Schleife
Mein Problem ist, wenn ich meine Anwendung schließe, die Worker Threads ordnungsgemäß zu beenden, aber 1 der 2 Sub-Main Threads hängt (nie beendet), wenn ich WM_QUIT ausstellen, um sie zu schließen .
procedure ThreadProcFQM(P: Integer); stdcall;
var
Msg: TMsg;
_FQM: TFQM;
begin
_FQM := Ptr(P);
try
_FQM.fHandle := AllocateHwnd(_FQM.WndProc);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
finally
DeallocateHWnd(_FQM.fHandle);
SetEvent(_FQM.hTerminated);
end;
end;
procedure TFQM.Stop;
begin
PostMessage(fHandle, WM_QUIT, 0, 0);
WaitForSingleObject(hTerminated, INFINITE);
if hThread <> INVALID_HANDLE_VALUE then
begin
CloseHandle(hThread);
hThread := INVALID_HANDLE_VALUE;
end;
end;
Hoppla, tut mir leid mein erstes Mal hier. Ich wusste nichts über Kommentare .... Ich werde es versuchen. Vielen Dank. – Atlas
Davy hat Recht: PeekMessage sollte verwendet werden, um die Nachrichtenwarteschlange zu erstellen – Remko
Sie lesen es auf der [MSDN-Seite für 'PostThreadMessage'] (http://msdn.microsoft.com/en-us/library/ms644946 (VS.85) .aspx). Sie empfehlen sogar, dass der Hauptthread auf ein Ereignis wartet, das der Thread festlegt, sobald die Nachricht erstellt wurde. –