Einzelnen Beitrag anzeigen

RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#4

AW: Generischen Typ "merken" zur späteren Verwendung

  Alt 20. Jun 2012, 11:19
Zu meiner Verteidigung: Ich bin gerade von Delphi 5 (endlich!) umgestiegen auf Delphi XE und lerne die ganzen neuen Sprachkonstrukte gerade erst kennen. Daher bin ich momentan etwas experimentierfreudig.

Dass das so mit den Generics gar nicht machbar ist, habe ich schon befürchtet, aber nicht ausgeschlossen, dass es doch einen Weg gibt.

... dürfen keine weiteren Windows-Messages verarbeitet werden, damit sich die Events von der Telefonanlage nicht gegenseitig überholen
Na dann brauchst du halt eine Warteschlange (Queue); an der einen Seite werden Objekte mit den Daten der Events eingestellt und am anderen Ende ausgelesen.
Als Trigger an den Hauptthread, dass sich Daten in der Queue befinden, kann man eine Windows-Message verwenden.
Diese Variante hatte ich aus irgendwelchen Gründen, die mir momentan nicht mehr vollständig gegenwärtig sind, verworfen. Es muss auf diese Events reagiert werden können, bevor weitere Windows-Messages verarbeitet werden. Das wäre mit dem von dir vorgeschlagenen Mechanismus nicht mehr gegeben. Also muss dem Anwender meiner Telefonanlagenschnittstellenunit eine einfache Möglichkeit gegeben werden, Methoden asynchron auszuführen - asynchron im Sinne von der Aufruf der Methode kehrt zurück, bevor die Methode vollständig abgearbeitet ist, was durch meine Methode mit den Windows-Messages gegeben ist.

Vorschlag z.B.: Nimm eine Queue, in die anonyme Methoden reingeschrieben werden. Die haben dann alle Typinformationen. Du kannst auch z.B. direkt TThread.Queue benutzen, je nachdem was du brauchst.
Dann sparst du dir die Messages bei der Verarbeitung und damit auch die Nebeneffekte.
Kannst du das mit der Queue etwas präzisieren? Welche Klasse meinst du genau? Wenn ich Generics.Collections.TQueue<T> benutze, dann habe ich m.E. das gleiche Problem. Call muss ja zurückkehren, bevor die übergebene anonyme Methode abgearbeitet wird - ich müsste genauso die Typinfos zwischenspeichern, was mit Generics nicht geht.

Mit Threads möchte ich gar nicht arbeiten, da ich damit eine Einschränkung an die anonymen Methoden stelle: Sie müssen threadsicher programmiert sein. Das kann ich hier nicht sicherstellen, da ich nicht der einzige Programmierer bin, der an dem Projekt arbeitet. Es gibt Programmierer hier, denen ich das einfach nicht zutraue - selbst ich wäre unsicher damit. Deshalb die Lösung des verzögerten Aufrufs über Windows-Messages.

Was ich mir als Quintessenz nun vorstelle, ist, auf die Vorzüge von Generics an dieser Stelle zu verzichten und stattdessen lediglich eine überladene Call-Methode anbiete, die als Parameter für die anonyme Methode einen Pointer ermöglicht. Damit lassen sich beliebige Daten an die asynchron aufzurufende anonyme Methode übergeben. Das ist weniger schön, eröffnet aber genauso alle Möglichkeiten.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat