![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 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