Also das wäre meine bevorzugte Lösung -> non blocket sockets aber ohne an Windows(-Nachrichten) gebunden zu sein.
Aber so etwas gibt es nicht - oder?
...
ähh
...
halt
...
Ok, man könnte sich in der OnClientRead-Behandlung eine Liste von eigenen Nachrichten erzeugen...
Dann wäre es nur Aufgabe des Mainthreads, die Nachrichten für den Manager aufzubereiten, wo diese dann verarbeitet werden.
In dem Sinne habe ich jetzt etwas realisiert und muss noch ein paar Details fertig stellen und testen.
Im Grunde gibt es mehrere Module (Interfaces), die miteinander verbunden - aber auch austauschbar - sind.
Die Businesslogik und die
GUI-Logik können IMessages für die Gegenseite erstellen und diese ihrem Handler übergeben.
Der Handler entscheidet, wann er die Message wirklich versendet und übernimmt das gesamte Protokoll.
Ebenso zerlegen die Handler beim Empfang von Nachrichten die (verbunden)Pakete in einzelne Häppchen, fordern sich von der Businesslogik bzw.
GUI-Logik (bzw. von deren MessageResolvern) entsprechende MessageInterfaces ab und entscheiden wiederum selbstständig, wann sie diese Messages tatsächlich zur Verarbeitung weiter geben.
Man kann Messages eine Priorität zuweisen oder den Status Singleton oder einen Timerwert.
Messages mit Priotät werden in der Messagequeue vorn eingefügt.
Singletons werden, falls sich schon eine gleichartige Message in der Queue befindet, durch die neue Message überschrieben (so lange die alte halt noch nicht verarbeitet wurde).
Timerwerte bewirken, dass Nachrichten dieser Identität frühestens n ms nach dem letzten Versand verschickt bzw. verarbeitet werden.
So kann man durch die Einstellung der IMessage-Eigenschaften den Handlern direkt vorgeben, wie sie den Versand optimieren sollen.
In der Buinesslogik und
GUI-Logik muss man nur noch die Messages erzeugen, aus erhaltenen StringListen wieder parsen und in der Logik verarbeiten.
Die Handler nutzen ihrerseits Module für die tatsächliche Datenübertragung (aktuell bei mir mit non blocking sockets).
Diese Module könnte man grundsätzlich auch austauschen, so dass man auch z.B. Indys nutzen könnte, ohne die Business- oder
GUI-Logik ändern zu müssen.
Besteht Interesse an der Lösung?
Dann würde ich nochmal ein Video erstellen und das Projekt hier einstellen.
Bis hierher sieht das gut aus. Ein paar Tage brauche ich dann aber noch für den Rest.