AW: AW: avanti-cl: Programmdatei erneuert

Harald Schmid Harald.Schmid at t-online.de
Di Mai 7 14:02:04 CEST 2002


Lieber Herr Höppner,

vielen Dank für Ihre Antwort. Ich war inzwischen nicht untätig und habe im
Internet einige Beiträge zu CreatePipe und Standardinput gefunden. Alles
natürlich in C(++) :-(((

> > 1. Wie kann ich dynamisch den Puffer der Ausgabe-Pipe
> dimensionieren? Im
> > Moment muß ich bei größeren zu erwartenden Datenmengen dem
> Aufruf von
> > CreatePipe einen entsprechend großen Puffer mitgeben. Aber
> zum Beispiel mit
> > dem Windows-Standardwert (4096 Bytes) kommt man nicht weit
> und stellt man
> > mehr ein, wird wohl einiges an Speicher verschwendet.
>
> Ja, es gibt da prinzipiell zwei Möglichkeiten:
>
> 1. Legen Sie eine temporäre Datei an, die Sie dann auch noch
> als Memory-Mapped-Datei
> ansprechen.
>
> 2. Basteln Sie sich eine dynamisch allozierte verkettete
> Liste, an die Sie jeden gelesenen Puffer
> als jeweils ein Element anhängen. Am Schluss wissen Sie, wie
> groß die Antwort ist, und
> können alles in einer Variablen ablegen.
>

Das mit der Puffergröße habe ich inzwischen ausprobiert und da Speicher ja
normalerweise kaum mehr ein Problem ist, folgendes entdeckt: Wenn ich den
Puffer der Output-Pipe auf 100 MB setze wird die Prozedur nicht langsamer
(zumindest nicht meßbar). Das heißt wohl, daß Windows den Speicher dynamisch
reserviert und somit kann man ja einen beliebig großen Wert angeben, der auf
jedenfall reicht (bis maximal 2 GB glaub ich). Das ist also nicht wirklich
ein Problem.

> > 2. Den Input bekomme ich noch nicht hin mit der Pipe. Es
> funktioniert, wenn
> > ich StdIn auf eine Datei lenke, die ich mit CreateFile auf
> eine Jobdatei
> > öffne. Aber es müßte doch auch mit einem Handle von
> CreatePipe gehen, in das
> > ich dann mit WriteFile schreibe. Mein Versuch sah bisher so aus:
> >
> > a) Job zusammenstellen in einer Char-Variablen (nach dem letzten
> > Zeilenumbruch ein Ascii 26 anhängen)
> > b) Pipe mit CreatePipe(InpHandle, OutpHandle, SecurityAttributes,
> > Puffergröße) erstellen
> > c) in das InpHandle den Job schreiben mit WriteFile(InpHandle, Job,
> > Joblänge, BytesWritten, nil)
> > d) jetzt einen Prozess starten für avanti-cl mit dem InpHandle und
> > OutpHandle als Standardinput und -output in der StartupInfo
> >
> > Und jetzt bleibt mein Programm hängen. Es sieht so aus, als
> würde avanti-cl
> > auf die Eingabe warten und diese nicht kommen oder zumindest nicht
> > vollständig. Weiß hier jemand Rat, wie man in den
> Standardinput eines
> > erzeugten Prozesses schreibt?
>
> Ich kann auch nur raten, weil ich mich mit der Materie auch
> nicht so gut auskenne. Aber ich
> würde meinen, dass Sie erst den Prozess starten sollten,
> bevor sie etwas in die Pipe
> reinschreiben.

Nach dem Durchstöbern der verschiedenen C-Quellcodes aus dem Internet fiehl
mir auf, daß diese oft für Input und Output eine eigene Pipe erzeugen, auch
wenn ich bei einem CreatePipe ja schon ein Input- und ein Outputhandle
bekomme. Ich verstehe das zwar noch nicht ganz, aber wenn ich eben auch zwei
getrennte Pipes verwende, funktioniert mein Input nun auch über WriteFile
und ich muß damit nicht mehr eine echte Datei für den Job anlegen. Soweit
sieht avanti-cl wirklich klasse aus!!! Herzlichen Dank.

Damit sind meine Probleme vorerst gelöst - wenn nicht neue auftauchen, dann
bin ich von der Lösung echt begeistert. Denn ein erster Performance-Test hat
auch noch ergeben (wie fast zu erwarten war), daß derselbe Job mit avanti-cl
und avanti-w (mit dem TCP/IP-"Overhead") nahezu nur ein Drittel an
Ausführungszeit benötigt, z.B. statt 290 ms nur noch ca. 100 ms (bei 40 kB
Daten). Ich werde also mit neuem Elan an meine Clients gehen und noch diese
Woche versuchen, den in Braunschweig vorgestellten Client auf avanti-cl
umzubauen. Der nächste Schritt ist für mich dann ein neuer Avanti-TCP/IP mit
avanti-cl als Grundlage.

***            Harald Schmid              ***
      EDV-Beratung und Programmierung
Bahnhofstr. 23, D-82347 Bernried, Deutschland

  Telefon  +49 (0)8158 / 90 34 99
  Fax      +49 (0)8158 / 90 35 99
  Mobil    +49 (0)179  / 52 82 414
  eMail    mailto:harald.schmid at t-online.de







Mehr Informationen über die Mailingliste Allegro