AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

Ein Thema von TiGü · begonnen am 8. Aug 2014 · letzter Beitrag vom 11. Aug 2014
Antwort Antwort
Seite 1 von 2  1 2   
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.926 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 13:29
Hallo Gemeinde,

in einer alten Codestelle will ich die System.Classes.IInterfaceList bzw. TInterfaceList mit einer eigenen generischen Liste ersetzen.

Da der normalen System.Generics.Collections.TThreadList<T> einige Methoden fehlen, wollte ich sie durch Ableitung ergänzen.

Wenn ich aber versuche für die Eigenschaft Items den Setter Put genauso wie in der alten TInterfaceList umzusetzen, sagt mir der Compiler, dass der linken Seite nichts zugewiesen werden kann.
Code:
[dcc32 Error] ThreadJob.pas(270): E2064 Left side cannot be assigned to
Siehe folgenden Code, die auskommentierte Stelle ist es.
Delphi-Quellcode:

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;

...
Wo ist denn da mein Denkfehler?
Wenn man den Typ konkretisiert, also statt T meinetwegen IInterface oder TMeinAuto , dann geht das.
Ist das ein Bug in XE3?

Geändert von TiGü ( 8. Aug 2014 um 14:32 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 15:12
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.

Geändert von Dejan Vu ( 8. Aug 2014 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 15:18
Die Dokumentation Delphi-Referenz durchsuchenSystem.Generics.Collections.TList.List sagt, dass das eine ReadOnly-Property ist. Eigentlich dürften - wenn überhaupt möglich - diese Änderungen gar nicht in der Liste ankommen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Aug 2014 um 15:38 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 15:33
Ich dachte immer, List[Index] :=Foo macht etwas anderes, als List.Insert(Index,Foo Wenn dem so wäre, wäre der Tipp vielleicht suboptimal.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.926 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 15:38
Deine Threadliste ist in deiner Implementierung ziemlich unperformant, wenn ich das sagen darf.
Du darfst das sagen.
Warum ist das so und wie geht es besser?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 15:38
Ich dachte immer, List[Index] :=Foo macht etwas anderes, als List.Insert(Index,Foo Wenn dem so wäre, wäre der Tipp vielleicht suboptimal.
In Kombination mit vorherigem Remove
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 8. Aug 2014, 16:30
In Kombination mit vorherigem Remove
"Dann ist aber der Eintrag nicht mehr an der selben Stelle." sagte Dejan und wunderte sich kurz darauf, wieso die Meute ihn an Füßen und Schultern packte, horizontal hin und her schaukelte, um ihn in hohem Bogen und unter hämischem Johlen, Grölen und Beifallklatschen der Anwesenden die Böschung hinunter zu werfen.

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:
Warum ist das so und wie geht es besser?
Du bietest dem Anwender die Möglichkeit, Daten einzeln in die Threadliste zu schreiben (wie man das von einer normalen Liste gewohnt ist). Es besteht also die Gefahr, das er (der Anwender, also ein anderer Programmierer) diese sehr praktische Möglichkeit nutzt, anstatt die anstehenden Änderungen zu sammeln, um sie explizit durch einmaliges Lock/Unlock in die Liste einzutragen.

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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.926 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 11. Aug 2014, 11:12
Warum ist das so und wie geht es besser?
Du bietest dem Anwender die Möglichkeit, Daten einzeln in die Threadliste zu schreiben (wie man das von einer normalen Liste gewohnt ist). Es besteht also die Gefahr, das er (der Anwender, also ein anderer Programmierer) diese sehr praktische Möglichkeit nutzt, anstatt die anstehenden Änderungen zu sammeln, um sie explizit durch einmaliges Lock/Unlock in die Liste einzutragen.
Du meinst ein klassisches AddRange()?
Ja, das wäre noch denkbar.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 11. Aug 2014, 11:38
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.424 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Eigene Ableitung von TThreadList<T> - Habe ich einen Denkfehler?

  Alt 11. Aug 2014, 11:57
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf