Einzelnen Beitrag anzeigen

slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#1

ThreadMessages in Service

  Alt 18. Aug 2011, 11:05
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

Geändert von slemke76 (18. Aug 2011 um 11:15 Uhr)
  Mit Zitat antworten Zitat