Einzelnen Beitrag anzeigen

BKempf

Registriert seit: 1. Jun 2004
103 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Rückgabewerte von TCriticalSection?

  Alt 9. Nov 2004, 21:06
Zitat von SirThornberry:
hast du schon versucht den Timer nach CriticalSection.Enter abzuschalten und wenn du mit "tuwas" fertig bist diesen wieder anzuschalten?
(Livemitschnitt meiner Überlegungen, ich bin an das Problem rangegangen mit der festen Überzeugung, daß da irgendwo Deadlocks entstehen würden.)

Nein, einen Timer dauernd ein- und auszuschalten finde ich böse
Wenn ich den Timer abschalte, wäre die CS überflüssig (da keine weiteren Events mehr auftreten können. Schalte ich ihn nicht ab, blockiert sie den Thread. Die CS ist also entweder nicht verwendbar oder überflüssig).
Theoretisch kann bei der Version mit abgeschaltetem Timer dann aber folgendes passieren:

- OnTimer wird aufgerufen, aber es wird gerade noch die Methode gestartet und plötzlich entscheidet sich Windows dafür, einem anderen Programm seine Aufmerksamkeit zu schenken.
- Wenn Windows irgendwann zu dem Programm zurückkehrt, wird OnTimer ein weiteres Mal aufgerufen, weil die 50ms wieder um sind. Der erste OnTimer ist noch nicht abgearbeitet, aber im Stack des Threads liegt der zweite Aufruf (da er jünger ist) weiter oben und wird abgearbeitet. Erste Anweisung ist Timer.enabled:=false.
TuWas wird ausgeführt, danach Timer.enabled:=true. Also alles in Butter?...
Nein, denn da lauert noch der erste, ältere Aufruf, der den Timer wieder abschaltet, TuWas ausführt und den Timer wieder einschaltet, ...

Huch, ich dachte, da würde sich was verklemmen. Ich war davon ausgegangen, daß der Timer sich ausschaltet und dann aus bleibt...

Gut, ein kleines Problem gibt es noch, nämlich wenn Windows so unpassend hin- und herschaltet, daß das Programm schneller OnTimer-Events bekommt, als es sie durch das Multitasking gebremst abarbeiten kann. Aber da muß ich wohl darauf vertrauen, daß sich selbst Win98 kein so gezielt userfeindliches Verhalten einfallen läßt.

Hm, mit dem "Timer dauernd ein- und ausschalten" sollte ich mich vielleicht doch baldmöglichst anfreunden, das scheint die einzige passende Lösung zu sein...

Hach, tut es gut, manchmal laut zu denken

Danke für die Anregungen.
The problem with troubleshooting is that sometimes the trouble shoots back.
  Mit Zitat antworten Zitat