| |
|
|
| aHttpDw: Asynchrones* Senden und Laden per HTTP
*(im Ggs. zum synchonen Laden ohne, dass das XProfan-Programm wartet, bis die Operation beendet ist)
Beim Weiterentwickeln vom Gonzo-Chat [...] war mir schnell klar, dass trotz Optimierung des prozesssynchonen HTTP-Datenbeziehens (z.B. über einfaches [...] ), mich störende Auszeiten der UI nicht verhindert werden können.
Ein (im Bezug zum XProfan-Thread welcher die Oberfläche und Interaktionen darstellt) asynchrones Beziehen der Daten musste her. Der XProfaner hat hier im Prinzip folgende Möglichkeiten, da XProfan von Haus aus nicht ermöglicht, über weitere Threads innerhalb des selben Prozesses weitere XProfanablaufstränge abzuarbeiten:
A) Zweiprozess-Variante: Ein Prozess stellt die UI bereit und ein zweiter Prozess die synchone Datenkommunikation. Beide Prozesse kommunizieren asynchron miteinander (z.B. über diese Pipes: [...] )
B) Einprozess-Mehrthread-Variante: Der XProfanprozess läuft wie gehabt und läd eine DLL (kann auch per Inline-ASM erzeugt werden) und die DLL erzeugt selbständig verwaltend Nebenthreads. DLL muss eine Schnittstelle für den XProfan-Prozess bieten, Daten asynchron zu beziehen und zu senden.
Variante A hat gegenüber Variante B den Nachteil, dass diese Speicher- und Performance-lastiger ist, aber den Vorteil, dass diese deutlich einfacher programmiert werden kann.
Variante B benötigt keinen eigenen/weiteren Prozess sondern nur Threads. Diese Variante habe ich gestern für/wegen Gonzo programmiert, die aHttpDw.Inc war geschaffen.
Die aHttpDw.Inc beinhaltet die aHttpDw.DLL welche speziell für die aHttpDw.Inc programmiert ist, ein Betreiben der aHttpDw.Dll ohne die Include ist nicht möglich da die Include Methoden für die DLL bereitstellt.
Tatsächlich kann mit der Include aber nicht nur heruntergeladen werden, ohne das dass XProfanprogramm "stoppt", sondern es können "zeitgleich" beliebig viele Downloads in Auftrag gegeben werden, welche alle "zeitgleich" abgearbeitet werden. Wenn man so will, dann könnte man es als "Downloadmanager" verkennen.
Die Include stellt im Grunde Zwei wichtige Möglichkeiten bereit:
aHttpDw(string url)
Legt auf den Abarbeitungsstapel die URL url und beginnt sofort die Daten zu laden. Zurückgegeben wird die Nummer des nächst-freien SLOT (Handle) welcher später benutzt wird, wenn die Daten vollständig empfangen wurden. Es können hierüber beliebig viele Sende/Lade-Aufträge abgesetzt werden.
und
aHttpDw.frame()
Wenn eine Datei vollständig heruntergeladen wurde, bzw. die Antwort des Server vollständig empfangen wurde, dann gibt aHttpDw.frame den SLOT zurück, andernfalls null. Über die Slotnummer kommt man dann einfach an die Antwort. (Binary-Safe)
Mit aHttpDw(url) vergibt man also den Auftrag, und über aHttpDw.frame() kann man asynchron/unregelmässig nachschauen, ob vielleicht bereits eine Datei vollständig geladen wurde.
Die Daten stehen also dann zur Verfügung, wenn man danach fragt (asynchron) und die Downloads beeinflussen den Hauptthread des XProfan nicht.
Ich werde aber zunächst zur Include (auch hier) ein paar Testprogramme posten. Eines davon wird eben auch Gonzo sein. |
|
|
| |
|
|