Hallo zusammen,
ich habe einen kleinen Dienst programmiert, der im ServiceStart drei Threads created und startet. Die Threads kommunizieren untereinander mit PostThreadMessage und GetMessage/PeekMessage. Klappt auch gut.
Jetzt möchte ich aber gerne dem Hauptprogramm aus einem Thread heraus eine Nachricht schicken, damit der zum Beispiel den gesamten Dienst beendet. Das habe ich folgendermassen angestellt:
Thread-Code:
Delphi-Quellcode:
New(InfoMessageRecord);
InfoMessageRecord^.ThreadID := GetCurrentThreadID;
InfoMessageRecord^.Content := 'Got critical error';
PostThreadMessage(fThreadIDs.Controller, CNTR_MESSAGING, CNTR_QUIT, 0);
// quick&dirty ;-)
// rum-Idlen bis der Thread beendet wird
while not Terminated do
Sleep(1000);
Der Wert von fThreadIDs.Controller wird im Hauptprogramm / ServiceStart mit GetCurrentThreadID() bestimmt (vielleicht ist das bereits der Fehler).
Im Hauptprogramm sieht .ServiceExecute so aus:
Delphi-Quellcode:
while not Terminated do begin
doFileDebug('[MAIN] polling PeekMessage....');
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
doFileDebug('[MAIN] PeekMessage fired....');
// bei WM_Quit immer raus.
if (Msg.message = WM_QUIT) or
((Msg.message = CNTR_MESSAGING) and (Msg.wParam = CNTR_QUIT)) then begin
// Irgendjemand sagt, er will beendet werden.
doFileDebug('[MAIN] got Program quit message');
// ServiceStopShutdown;
end;
end;
// Keine Nachricht.
// Schlafen legen und wieder von vorn ;-)
Sleep(1000);
ServiceThread.ProcessRequests(False);
end;
doFileDebug ist Thread-Safe.
Die "[MAIN] polling PeekMessage.." kommt.
Wird jetzt aber im Thread "PostThreadMessage" ausgeführt, stürzt alles ab.
Wo ist mein Denkfehler?
Kann ich PostThreadMessage überhaupt verwenden ?
Ist GetCurrentThreadID() verkehrt?
Ich vermute, ich habe hier den falschen Ansatz - ein self.threadid gibt’s auch nicht habe ich gerade gesehen. Wie lässt sich die gewünschte Funktionalität sonst umsetzen ?
Danke,
Sebastian