Einzelnen Beitrag anzeigen

Blubbels

Registriert seit: 21. Okt 2008
8 Beiträge
 
#5

Re: Thread in DLL suspendieren

  Alt 30. Jan 2009, 08:58
Ihr seid beide schonmal virtuelles Gold wert, danke

@DMW: Ja das hatte ich auch schon gelesen

Und mehrfach drüber gegrübelt, zugegeben!

Primärzweck ist nicht Debuggen, sondern Userkomfort (rechenintensiven Vorgang pausieren), aber der Begriff Primärzweck sagt ja noch nicht aus, daß das die einzige Nutzung sein darf.

"It is not intended to be used for thread synchronization." ist auch klar. Benutze ich auch nicht dafür - synchronisieren tue ich über critical sections.

Hinauslaufen tut das dann vermutlich auf:
Zitat:
should signal the other thread to suspend itself. The target thread must be designed to watch for this signal and respond appropriately.
Auch das habe ich eigentlich umgesetzt, indem ich das Betreten und Verlassen der Critical Section mit einem Event kombiniere, auf den ich vor dem Pausieren warte und es nach Timeout gar skippe:

Delphi-Quellcode:
procedure ThreadEnterCritical;
begin
   CritialThreadEvent.ResetEvent;
   CritialThreadSection.Enter;
end;

procedure ThreadLeaveCritical;
begin
   CritialThreadSection.Leave;
   CritialThreadEvent.SetEvent;
end;

function IsInThreadCritical(const TimeOut: cardinal): boolean;
begin
   Result := (CritialThreadEvent.WaitFor(TimeOut)=wrTimeout);
end;
IsInThreadCritical ist halt im Code im ersten Post als Abbruchbedingung noch hinzugefügt.
Hmmm... mache ich da gerade etwas dummes fällt mir so auf, brauche ich evtl. eine zweite TEvent-Instanz für den Event, um in IsInThreadCritical von außen zu prüfen?

Könnte ich das sonst irgendwie besser machen, hab ich die MSDN-Empfehlung da falsch verstanden?
Genau genommen steht da ja drin, dem Thread selber zu signalisieren, davor hatte ich etwas zurückgeschreckt, weil mich schon das ewige "if not Terminated" ziemlich annervt und ich es für unschön empfinde

@sirius: auf threadinterne Variablen greif ich von außen eh nicht zu, genausowenig wie auf threadöffentliche Die sind tabu, solange der Thread nicht terminiert ist, ganz klar, da gibt es nur einseitige Kommunikation, nämlich Ereignisse (Synchronize/CriticalSection). Direkt eingebunden ist das ja auch alles sauber genug, um sich nicht eben so aufzuhängen.

Der Thread verarbeitet größere Dateien, Kein Netzwerk, keine Datenbank, kein COM (hmmm das könnte ich nochmal genauer prüfen!) oder sonstwas spektakuläres, aber immerhin soviel Code, daß ich nach einem genervten Tag der Suche erstmal wieder hier fragen wolte, ob ich was generelles übersehe

Die kleine Endlosschleife klappt übrigens problemlos, ja, das hatte ich schon getestet

Auch Dir ein Danke für den Hinweis bzgl. des Pausierens von außerhalb. Wie oben geschrieben hatte ich eigentlich gedacht ich hätte das mit dem Event abgedeckt, aber sollte mir dann wohl noch ein echtes internes Pausesystem überlegen?
  Mit Zitat antworten Zitat