मेरा आवेदन कई सूत्र है: 1) मुख्य थ्रेड 2) 2 उप मुख्य धागे (संदेश लूप के साथ प्रत्येक, जिन्हें आप नीचे), TFQM 3) एन कार्यकर्ता धागे (सरल द्वारा प्रयोग किया जाता लूप, जिसमें नींद())डेल्फी मल्टी-थ्रेडिंग संदेश लूप
मेरी समस्या यह है कि, जब मैं अपना आवेदन बंद करता हूं, तो वर्कर थ्रेड्स ठीक से बाहर निकलने का प्रबंधन करते हैं, लेकिन 2 उप-मुख्य थ्रेड्स में से 1 लटकता है (कभी बाहर नहीं निकलता है) जब मैं उन्हें बंद करने के लिए WM_QUIT जारी करता हूं ।
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;
ओउप्स, मेरी पहली बार खेद है। टिप्पणियों के बारे में नहीं पता था .... मैं इसे आज़मा दूंगा। धन्यवाद। – Atlas
डेवी सही है: संदेश कतार – Remko
बनाने के लिए PeekMessage का उपयोग किया जाना चाहिए [इसे 'पोस्ट थ्रेड मैसेज' के लिए [एमएसडीएन पृष्ठ] पर पढ़ें [http://msdn.microsoft.com/en-us/library/ms644946 (VS.85) .aspx)। वे यह भी सिफारिश करते हैं कि मुख्य थ्रेड किसी ईवेंट पर प्रतीक्षा करें जो थ्रेड सेट हो जाने पर एक बार संदेश बनाया गया हो। –