Ein Thread besitzt einen TTimer und dessen OnTimer-Methode soll alle 50ms einen kleinen Teil einer größeren Aufgabe (Aufräumen von Datenbanken) durchführen (um diese eigentlich sehr plattenintensive Aktion über einen langen Zeitraum zu strecken). Kann ich dafür TCriticalSection verwenden?
Mein Problem ist, daß alle Ereignisse im Kontext desselben Threads stehen, d.h. wenn ich
Delphi-Quellcode:
cs.Enter;
TuWas;
cs.Leave;
schreibe und TuWas so lange dauert, daß der nächste ausgelöste Event wieder
cs.Enter;
ausführen will, dann beißt sich der Thread selbst in den Schwanz und bleibt hängen, weil die letzte Instanz der Methode darauf wartet, daß die vorherige cs wieder unlockt (was sie aber nicht tun kann, da momentan die zweite Instanz ausgeführt wird).
Daher bräuchte ich sowas wie
Status:=cs.Enter;
das die CriticalSection nicht nur nötigenfalls lockt, sondern mir auch gleich mitteilt, ob sie vorher schon gelockt war oder nicht (und das vor allem nicht durch Multitasking unterbrechbar ist). Entsprechend würde ich nur im zweiten Fall TuWas ausführen und im ersten einfach nichts tun.
Kann TCriticalSection das? Ich kenne nur "Enter" und "Leave" und habe sonst auch nichts in der
OH gefunden. Gibt es evtl. andere Typen, die die genannte Funktion haben?
The problem with troubleshooting is that sometimes the trouble shoots back.