Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Welchen Typ für mehrdimensionalen Buffer verwenden? (https://www.delphipraxis.net/80538-welchen-typ-fuer-mehrdimensionalen-buffer-verwenden.html)

hirnstroem 10. Nov 2006 14:32


Welchen Typ für mehrdimensionalen Buffer verwenden?
 
'loha Folks,

ich suche momentan den idealen Typ zur Realisierung eines mehrdimensionalen Buffers.

Folgendes Szenario:

Über den COM-Port werden Daten eingelesen, mit der Urhzeit und einer BenutzerID ergänzt und in einen Buffer geschoben. Die Daten(sätze) warten in diesem Buffer auf ihre Weiterverarbeitung (bis sie gelöscht werden im Endeffekt).

Prinzipiell käme dies ja dem schreiben eines Datensatzen in eine Datenbank gleich.

Nun bin ich mir nicht sicher, wie man diesen Buffer genau aufbauen soll.

Meine Idee wäre folgende:
Delphi-Quellcode:
  TInputBuffer = record
    User: TStringList;
    Data: TStringList;
    Time: TStringList;
  end;
Die StringList deshalb, weil man sich da um nichts kümmern muss, d.h., Zeilen können einfach hinzugefügt und entfernt werden. Also double linked list like.

Ist dies eine gute Idee? Wenn nein, wie wäre es besser?

Danke und Gruss
hirnstroem

Der_Unwissende 10. Nov 2006 16:47

Re: Welchen Typ für mehrdimensionalen Buffer verwenden?
 
Hi,
ich bin mir nicht ganz sicher, ob ich alles richtig verstanden habe. Ehrlich gesagt sehe ich nämlich nicht ganz den Grund, warum du drei StringListen verwaltest.

Wenn ich alles richtig verstanden habe, dann bekommst du eine bestimmte Anzahl n von Daten, die du um zwei weitere Informationen erweiterst. Jedes Datum wird einfach in einer Warteschlange abgelegt und irgendwer kümmert sich dann von Zeit zu Zeit mal um die Schlange.
Das ganze spricht eigentlich mehr dafür, dass du einen Datentypen benutzt, der sich aus den drei einzelnen Informationen zusammensetzt. Immerhin gehört die Benutzer-Information und die Zeitangabe zu dem Datum, dass empfangen wurde.
Deshalb einfach einen Datentypen erstellen, der die entsprechende Form hat (ich bleib mal hier bei Strings, kannst du aber natürlich beliebig anpassen):
Delphi-Quellcode:
type
  TInput = record
    user : String;
    data : String;
    Time : String;
  end;
Was du nun eigentlich suchst wäre dann eine Struktur um eine Menge dieser Daten zu verwalten. Es bietet sich hier im übrigen der Datentyp einer (Warte-)Schlange/Queue an. Wie Listen ist das ein abstrakter Datentyp, du kannst ihn z.B. durch eine Liste realisieren. Die einfache Idee ist, dass du FirstIn-FirstOut realisierst. Es gibt eine Möglichkeit für dich ein Datum anzuhängen, zu schauen wie viele Elemente in der Liste sind und wenn sich mindestens ein Element in der Liste befindet, kannst du das erste Element entfernen.
Es kommen natürlich noch andere Möglichkeiten in Frage, aber die hier sollte es schon sehr gut tun. Wie gesagt, der Datentyp ist abstrakt, du kannst dir hier also selbst überlegen ob und wie du den implementieren möchtest.
An sich kannst du eigentlich sehr direkt mit einem TList Objekt arbeiten. Eine TList ist eine einfache Form von Liste, die dir alles mögliche schon ermöglicht. Du hast sogar einen Wahlfreien Zugriff auf einzelne Elemente (intern wird ein Array verwendet).

Eigentlich musst du nur ein TInput erzeugen und mittels der Add Funktion an die Liste anhängen. Beim entfernen musst du noch casten (Listen speichern nur allgemeine Zeiger), fertig.
Etwas schöner geht das ganze noch, wenn du statt einem Record eine Klasse erzeugst. Diese kannst du dann in einer TObjectList verwalten. Der größte Vorteil liegt dann darin, dass die TObjectList auch alle Instanzen frei geben kann, wenn sie zerstört wird, bei einer TList musst du dich selbst drum kümmern.

Gruß Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz