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?