![]() |
Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Hallo Gemeinde,
in einer alten Codestelle will ich die
Delphi-Quellcode:
bzw.
System.Classes.IInterfaceList
Delphi-Quellcode:
mit einer eigenen generischen Liste ersetzen.
TInterfaceList
Da der normalen
Delphi-Quellcode:
einige Methoden fehlen, wollte ich sie durch Ableitung ergänzen.
System.Generics.Collections.TThreadList<T>
Wenn ich aber versuche für die Eigenschaft
Delphi-Quellcode:
den Setter
Items
Delphi-Quellcode:
genauso wie in der alten
Put
Delphi-Quellcode:
umzusetzen, sagt mir der Compiler, dass der linken Seite nichts zugewiesen werden kann.
TInterfaceList
Code:
Siehe folgenden Code, die auskommentierte Stelle ist es.
[dcc32 Error] ThreadJob.pas(270): E2064 Left side cannot be assigned to
Delphi-Quellcode:
Wo ist denn da mein Denkfehler?uses System.Generics.Collections; type TGenericThreadList<T> = class(System.Generics.Collections.TThreadList<T>) private function Get(Index: Integer): T; function GetCount: Integer; procedure Put(Index: Integer; const Item: T); procedure SetCount(const NewCount: Integer); public function First: T; property Count: Integer read GetCount write SetCount; property Items[Index: Integer]: T read Get write Put; default; end implementation uses System.RTLConsts; ... procedure TGenericThreadList<T>.Put(Index: Integer; const Item: T); var LList: TList<T>; begin LList := LockList; try if (Index < 0) or (Index >= LList.Count) then LList.Error(SListIndexError, Index); // LList.List[Index] := Item; <--- das schluckt er nicht! LList.Items[Index] := Item; // <--- das kompiliert finally UnlockList; end; end; ... Wenn man den Typ konkretisiert, also statt T meinetwegen
Delphi-Quellcode:
oder
IInterface
Delphi-Quellcode:
, dann geht das.
TMeinAuto
Ist das ein Bug in XE3? |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Na ja. List hat nur einen getter und ist damit read-only. Denke ich.
Deine Threadliste ist in deiner Implementierung ziemlich unperformant, wenn ich das sagen darf. Aber ich vermute, dir kommt es in erster Linie auf Kompatibilität an. |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Die Dokumentation
![]() |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Ich dachte immer,
Delphi-Quellcode:
macht etwas anderes, als
List[Index] :=Foo
Delphi-Quellcode:
:stupid: Wenn dem so wäre, wäre der Tipp vielleicht suboptimal.
List.Insert(Index,Foo
|
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Zitat:
Warum ist das so und wie geht es besser? |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Zitat:
|
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Zitat:
Sir Rufo, der Edle (wie er von seinen Vasalen genannt wird), schüttelte nur augenbrauenwackelnd den Kopf und ritt ins Wochenende. Dejan, wieder zu sich gekommen, krabbelte die Böschung hinauf, setzte sich wieder hin und schrieb: Zitat:
Die Implementierung der 'Put' Methode ('Set' hat sich eigentlich als Name etabliert, genauergesagt :SetItem', wenn 'Item' der Name der Property ist) an sich ist vollkommen ok. |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Zitat:
Ja, das wäre noch denkbar. |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Ja genau. Dann gibt es zwar immer noch Dumpfbacken, die das nicht verwenden, aber besser wäre das. Ich persönlich würde den Setter weglassen, aber nicht in deinem Fall: Wir reden aber hier ja nicht von einer allgemeinen Threadlist, sondern einem mit möglichst wenig Aufwand zu implementierenden threadsicheren Ersatz für deine Listen und da geht Kompatibilität vor Performance. Erstmal soll es laufen. Den Setter kannst Du dann später irgendwann wegschmeißen und schauen, wie viel Arbeit das Umschreiben wäre...
Ich wollte ja nur darauf hinweisen ;-) |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Natürlich könnte man auch direkt LockList und UnlockList aufrufen
und dann kann man ja dennoch problemlos mehrfach etwas in der Liste machen. CriticalSections sind schneller, als man vielleicht denkt. |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
@Devan:
Warum die Setter-Methode wegschmeißen? Es gibt immer Situationen, wo man wirklich nur ein Element hinzufügen will. @Himi: Aber auch nur bei einer eigenen Implementierung von TThreadList<T>. Schau mal was in deinen XE3 in Zeile 2495 in System.Generics.Collections steht. |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Zitat:
Es ist nur ein Hinweis, das man Klassen auch gegen Idioten schützen kann, und manchmal muss. |
AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?
Das XE hier meint es kenne noch kein TThreadList<T> :stupid:
OK, wie schnell das TMonitor-Zeugs ist, weiß ich nicht. Aber die CriticalSextions sind ganz schön flott. Das konnte locker mit einem selbstimplementieren Interlocked-BOOL in Assembler mithalten, weswegen ich es vor paar Jahren aufgab sowas noch optimieren zu wollen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz