Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TQueue<T> - Aufträge prioritisieren (https://www.delphipraxis.net/165036-tqueue-t-auftraege-prioritisieren.html)

himitsu 12. Dez 2011 08:09

Delphi-Version: 2010

TQueue<T> - Aufträge prioritisieren
 
Hab ich das falsch gesehn, oder kann man bei der TQueue Aufträge nicht "löschen", also mittendrin entfernen,
bzw. nach einer Prioritisierung vorzeitig abarbeiten?

Also im Prinzip muß ich das dann wohl wieder selber implenentieren?
(oder, da Delphi mal wieder nur halbfertiges Zeug anbietet, mir den Stoff wo anders besorgen)

Oder gibt es doch schon was Fertiges?
(im Notfall müßte ich mir dann wohl eine TList<T> dafür erweitern)


'nen schnen Tag noch :hi:

Iwo Asnet 12. Dez 2011 08:15

AW: TQueue<T> - Aufträge prioritisieren
 
Findest du das rumfrickeln in einer Queue nicht etwas umständlich?
Ein Auftrag könnte/sollte doch vor Ausführung prüfen, ob er noch valide ist.

Das Löschen ist problematisch bei den Aufträgen, die gerade für die Prozessierung entnommen, aber noch nicht (ganz) ausgeführt wurden. Sind sie (noch) gültig oder (schon) ungültig?

Diese Frage wird sich natürlich während der Ausführung immer wieder stellen, aber die Definition ist dann einfacher.

Es ist kniffelig zu beschreiben, das zum Zeitpunkt X alle Aufträge mit einer bestimmten (nun ungültigen) Eigenschaft aus der Queue zu löschen sind und die, die gerade entommen wurden, auch, aber die die schon teilweise ausgeführt werden, nicht.

Einfacher ist es imho so:
"Vor der Durchführung prüft der Auftrag, ob alle Startbedingungen erfüllt sind und führt den Auftrag aus".

himitsu 12. Dez 2011 08:28

AW: TQueue<T> - Aufträge prioritisieren
 
Die Aufträge sind alle Valide, beim Einfügen.

Es sollte nur eine Möglichkeit geben, Aufräge mit höheren Prioritäten früher auszuführen.
Aktuell hab ich mir mit 2 Queues geholfen.
- eine für "sofort, bzw. so schnell wie möglich bearbeien"
- eine für "wenn du mal Zeit hast"
Eine/Zwei Queue deswegen, weil die Einzelaufträge, je Priorität, nur in der Reihenfolge verarbeitet werden sollen, wie sie reinkommen.
Sonst hätte ich auch eine Liste, bzw. einen Stack nehmen können und hätte das Wichtigere einfach vorn angehängt, aber dann stimmt die Reihenfolge nicht mehr.


Und ansonsten wollte ich eben noch eine Funktion einfügen, für die Endverbraucher der Komponente, ala "schau ob ein Auftrag in der Queue liegt" oder "füge nur ein, wenn noch kein gleichnamiger Auftrag in der Liste existiert" und vorallem "brich alle Aufträge mit bestimmten Namen ab".

Codewalker 12. Dez 2011 10:24

AW: TQueue<T> - Aufträge prioritisieren
 
Zitat:

Zitat von himitsu (Beitrag 1140925)
Hab ich das falsch gesehn, oder kann man bei der TQueue Aufträge nicht "löschen", also mittendrin entfernen,
bzw. nach einer Prioritisierung vorzeitig abarbeiten?

War das nicht der prinzipielle Unterschied zwischen Queue und Stack, dass man bei einem von beiden (ich meine es war der Stack) auch "Zwischenelemente" ansehen darf und bei der Queue wirklich stupide nur das vorderste Element?

Sir Rufo 12. Dez 2011 10:42

AW: TQueue<T> - Aufträge prioritisieren
 
Zitat:

Zitat von Codewalker (Beitrag 1140953)
Zitat:

Zitat von himitsu (Beitrag 1140925)
Hab ich das falsch gesehn, oder kann man bei der TQueue Aufträge nicht "löschen", also mittendrin entfernen,
bzw. nach einer Prioritisierung vorzeitig abarbeiten?

War das nicht der prinzipielle Unterschied zwischen Queue und Stack, dass man bei einem von beiden (ich meine es war der Stack) auch "Zwischenelemente" ansehen darf und bei der Queue wirklich stupide nur das vorderste Element?

Es handelt sich hierbei um die Umsetzung von
Stack = LiFo (Last In - First Out)
Queue = FiFo (First In - First Out)
und nicht mehr.

Weitere Spezialitäten muss man selber implementieren.

himitsu 12. Dez 2011 12:15

AW: TQueue<T> - Aufträge prioritisieren
 
Der TStack kann doch auch mehr?
er kann ebenfalls FiFo und man kann das Zeugs, oben und/oder unten reinschieben, sowie oben und/oder unten rausholen.

shmia 12. Dez 2011 12:23

AW: TQueue<T> - Aufträge prioritisieren
 
Es gibt da so verschiedene Datenstrukturen:Eine Priority Queue könnte für deine Anforderungen wohl passend sein.

Uwe Raabe 12. Dez 2011 14:05

AW: TQueue<T> - Aufträge prioritisieren
 
Zitat:

Zitat von himitsu (Beitrag 1140975)
Der Stack kann doch auch mehr?
er kann ebenfalls FiFo und man kann das Zeugs, oben und/oder unten reinschieben, sowie oben und/oder unten rausholen.

Wie soll das denn gehen?

Medium 12. Dez 2011 14:40

AW: TQueue<T> - Aufträge prioritisieren
 
Er denkt vermutlich an die Delphi Klasse "TStack", andere haben den eigentlichen Stack aus der Prozessorarchitektur im Kopf ;) (Letzterer ermöglicht diesertage aber auch oft "Mittenrauslesen", z.B. der FPU Stack. Das war aber noch nicht so, als man das Wort mit seiner ursprünglichen Bedeutung belegt hat.)

Uwe Raabe 12. Dez 2011 15:57

AW: TQueue<T> - Aufträge prioritisieren
 
Zitat:

Zitat von Medium (Beitrag 1140991)
Er denkt vermutlich an die Delphi Klasse "TStack"

Ich hatte dabei an die Klasse TStack<T> gedacht, konnte aber (zumindest unter XE2) keine Möglichkeit erkennen, wie man diese als FiFo nutzen oder gar Elemente irgendwo aus der Mitte herausziehen könnte. Vielleicht übersehe ich da ja auch etwas?

Andererseits würde es mir auch nicht einleuchten, wenn TStack<T> bereits als LiFo und als FiFo genutzt werden kann, warum dann überhaupt noch ein TQueue<T>?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 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