i would like to send a message with postmessage() to a TObject instance, but after the thread terminates, the program does not step into method HandleThreadCompletion.
const
WM_THREAD_COMPLETE = WM_USER + 5437;
The TObject instance (TMaster) contains the identifier for the thread object
type
TMaster = class(TObject)
private
...
Fslave_search_thread : Tsrch_slave_thread;
fMsgHandlerHWND : HWND;
function start_slvsearch_th: integer;
procedure HandleThreadCompletion(var Message: TMessage);
...
public
...
end;
constructor TMaster.Create (aNode: TTreeNode; aName, anIP, aMAC: string);
begin
...
fMsgHandlerHWND := AllocateHWnd(HandleThreadCompletion);
...
end;
I free and nil the thread in TMaster.HandleThreadCompletion()
procedure TMaster.HandleThreadCompletion(var Message: TMessage);
begin
if message.msg = WM_THREAD_COMPLETE then begin
if Assigned(Fslave_search_thread) then
begin
Fslave_search_thread.WaitFor;
Fslave_search_thread.Free;
Fslave_search_thread := nil;
...
end
end else
message.result := DefWindowProc(fMsgHandlerHWND, Message.Msg, Message.wParam, Message.lParam) ;
end;
Creating the thread here (suspended), filling some fields than starting it (resume).
function TMaster.start_slvsearch_th: integer;
var
i: integer;
begin
if not Assigned(Fslave_search_thread) then begin
...
Fslave_search_thread := Tsrch_slave_thread.Create(true);
...
with Fslave_search_thread do
begin
master := self;
master_HWND := self.fMsgHandlerHWND;
FreeOnTerminate := False;
Resume;
...
end;
end;
When terminated (with setting the terminate flag from outside or the cycle finishes), sending the message:
procedure Tsrch_slave_thread.Execute;
begin
while master.CMD_LISTCNT = 1 do
begin
...
if terminated then break;
end;
PostMessage(master_HWND, WM_THREAD_COMPLETE, 0, 0);
...
end;
http://members.upclive.hu/ikt/thread_terminate_test_postmessage.zip