Warum wurde der Debugger nicht benutzt, oder hat der dir wirklich nicht den Grund genannt?
Zitat:
Erste Gelegenheit für
Exception bei $7534C42D.
Exception-Klasse EListError mit Meldung 'Listenindex überschreitet das Maximum (3)'. Prozess ObjectInThread.exe (162412)
In Zeile
Synchronize(FireOnEnde);
. (Fehlerzeile im Debugger durch Synchronize verfälscht, aber mit Haltepunkt in ThreadEnde wäre man auch so an die Richtige Zeile gekommen, wenn man das nicht von selber erkennt "3 Mal klicken ... 0-2 ... ahhhhhh")
Das Programm zeigt die
Exception natürlich nicht an, weil DU nicht die Exceptions im Thread behandelst.
Die
VCL zeigt nur Exceptions im Hauptthread an und da auch nur die, welche nicht via Synchronize in andere Threads umgeleitet werden.
Grund, warum es beim 3. Klick knallt:
if ID > 2 then
Zitat:
// Bei ID < 3 läuft alles durch. Es muss also Probleme beim Speichern geben.
Also, der erste Satz wurde gut erkannt, aber die Schlussfolgerung ist natürlich falsch, was der Debugger einem aber zeigen täte,
denn es knallt schon vor dem Speichern, beim Zugriff auf die Liste.
Zitat:
Delphi-Quellcode:
Inc(fObjectID);
lMyObject:=TMyObject.create(fObjectID);
Index:=fObjectList.Add(lMyObject);
Wieso bekommt das TMyObject
eine andere ID
einen anderen Index, als dann in ThreadEnde benutzt wird?
1: fObjectID=1 und Index=0 -> übersprungen
2: fObjectID=2 und Index=1 -> übersprungen
3: fObjectID=3 und Index=2 -> ID=Index 3 gibt es nicht -> *peng
Und wehe du kommst auf die Idee ID-1 zu rechnen.
Man benutzt keine unabhängigen/unsynchronisierten Zähler für eine gemeinsame Sache