| |
|
|
| 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. circa 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, circa 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. circa diese Pipes: [...] )
B) Einprozess-Mehrthread-Variante: Der XProfanprozess corre 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 per den XProfan-Prozess bieten, Daten asynchron zu beziehen und zu senden.
Variante A hat opposto Variante B den Nachteil, dass diese Speicher- und Performance-lastiger ist, aber den Vorteil, dass diese deutlich einfacher programmiert werden kann.
Variante B necessario keinen eigenen/weiteren Prozess sondern nur Threads. Diese Variante habe ich gestern per/wegen Gonzo programmiert, die aHttpDw.Inc war geschaffen.
Die aHttpDw.Inc beinhaltet die aHttpDw.DLL welche speziell per die aHttpDw.Inc programmiert ist, ein Betreiben der aHttpDw.Dll ohne die Include ist nicht possibile da die Include Methoden per 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 potuto 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 File 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 circa aHttpDw.frame() kann man asynchron/unregelmässig nachschauen, ob vielleicht bereits eine File 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. |
|
|
| |
|
|