Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi EOutPutBufferTooSmall- Async Pro (https://www.delphipraxis.net/20934-eoutputbuffertoosmall-async-pro.html)

EConvertError 25. Apr 2004 15:49


EOutPutBufferTooSmall- Async Pro
 
Hallo!

Hier bin ich wieder einmal wieder mit meinen Async Pro Problemen.
Ich bekomme nämlich immer, wenn ich eine etwas längere Datei senden will, eine EOutPutBufferTooSmall Exception mit der Meldung "OutPutBuffer too small for block".

Der Code:
Delphi-Quellcode:
  try
    ApdComPort.Open:= TRUE;
    for I:= 0 to Txt.Count-1 do begin
      ApdComPort.Output:= Txt[I]+#10#13; //Send Txt
    end;
  finally
    ApdComPort.Open:= FALSE;
  end;
Txt ist vom Typ TStrings und ist der Inhalt eines Memos. Bei nicht so langen Dateien funktioniert das ganze auch gut, nur eben bei längeren Textdateien bekomme ich Schwierigkeiten.

Was passt denn da jetzt nicht? Welchen Buffer muss ich da größer stellen? Und vor allem auf welche Größe?

Vielen Dank für eure Hilfe,
Andy

EConvertError 27. Apr 2004 19:00

Re: EOutPutBufferTooSmall- Async Pro
 
Weiß denn wirklich niemand eine Lösung?

Hansa 27. Apr 2004 20:26

Re: EOutPutBufferTooSmall- Async Pro
 
Zitat:

Zitat von EConvertError
Weiß denn wirklich niemand eine Lösung?

Nein, keiner. :mrgreen: Weil : wie oder was machst Du denn da überhaupt ? Wie hoch ist der Puffer eingestellt (Input und Output) ? Ist irgendeine Flow-Control eingeschaltet ? Vermute mal nicht. Dann schraube den Puffer eben noch höher, bis eine Datei doch ein Byte zuviel hat. :wink: Wenn Du weißt, was ich meine. 8)

EConvertError 28. Apr 2004 17:56

Re: EOutPutBufferTooSmall- Async Pro
 
Also dann werde ich jetzt ein paar genauere Informationen bekanntgeben. :mrgreen:

Was ich überhaupt machen will? Einfach nur Textdateien jeder Größe über den COM Port senden und empfangen.

Ja also die property Insize (output buffer) ist 4096 (default). In der Hilfe wird dieser Wert empfohlen. Flowcontrol ist keine eingeschaltet.

Ist es denn eine gute Idee einfach den Puffer größer zu stellen? Oder sollte man nicht irgendwie warten, bis er leer ist? Oder ist vielleicht beides möglich? :?:

mfg,
EConvertError

Hansa 28. Apr 2004 18:06

Re: EOutPutBufferTooSmall- Async Pro
 
Zitat:

Zitat von EConvertError
...Ist es denn eine gute Idee einfach den Puffer größer zu stellen? Oder sollte man nicht irgendwie warten, bis er leer ist?

Natürlich ist das keine gute Idee. :mrgreen: Was ist denn mit OutSize ?? Ich würde auf jeden Fall SW/HW Handshake benutzen.

Edit : Sehe gerade den Titel des Threads, tja dann schau mal nach. 8)

EConvertError 28. Apr 2004 18:22

Re: EOutPutBufferTooSmall- Async Pro
 
Oh, ich bitte vielmals um Entschuldigung, ich habe mich verschrieben. Ich habe Outsize (nicht Insize) gemeint. Der Rest stimmt, also der Wert ist 4096. :oops:

Leider kann ich mir das mit dem Handshake nicht aussuchen. Der Benutzer kann entscheiden, ob er das will oder nicht.

Also ist es keine gute Idee einfach Outsize größer zu stellen? Wie soll ich denn warten, bis wieder Platz im Buffer ist?

Oder hat sich das mit der schlechten Idee auf das Verstellen von Insize bezogen?

mfg,
EConvertError

Hansa 28. Apr 2004 18:29

Re: EOutPutBufferTooSmall- Async Pro
 
Du mußt noch einiges darüber nachlesen. Was du machst ist, den Wasserhahn aufzudrehen ohne darauf zu achten, ob noch Platz im Faß ist und läßt alles überlaufen. Das Faß muß dem Wasserhahn sagen : STOP !!! bis irgendeiner mit einem Eimer wieder Platz schafft. :shock: Dann sagt das Faß: mache weiter, bis es wieder fast voll ist und sagt wieder STOP ! Und der Wassertropfen, der Dein Faß eventuell zum überlaugen bringen könnte ist die Reserve und das ist das Insize/Outsize. :mrgreen: :lol:

EConvertError 28. Apr 2004 18:34

Re: EOutPutBufferTooSmall- Async Pro
 
Wow, die Reaktionszeit ist genial. Das ist ja schon fast ein Chat hier. :mrgreen:

Danke, das hast du gut erklärt, Hansa.

Wenn ich das richtig verstehe, dann habe ich 2 Möglichkeiten:
1) Ich erhöhe Outsize auf die Größe der Datei.
2) Ich warte bis der "Eimer" wieder Platz geschafft hat.

Welche der beiden ist denn nun besser?

mfg,
EConvertError

Hansa 28. Apr 2004 19:21

Re: EOutPutBufferTooSmall- Async Pro
 
1) wäre ein Faß ohne Boden, das nützt auf Dauer nichts.
2) der Eimer muß das Faß fragen, wieviel Platz es braucht, also wie lange das nächste mal der Hahn aufgedreht wird. Und der Eimer weiß dann, was zu tun ist. Ist er zu lahm, so muß das Faß dem Wasserhahn sagen, daß er sich schließen soll, so lange bis der Eimer fertig mit der Arbeit ist. :lol:

So, jetzt aber genug mit Wasser. Habe nachgeschaut :

Delphi-Quellcode:
const InBufSize   = 8 * 1024;
      OutBufSize  = 4 * 1024 + 50;
      HWHandshakeOptions = hfUseRTS or hfRequireCTS;
Wie du siehst wird das Faß bis zu maximal der Hälfte der verfügbaren Reserve gefüllt.

EConvertError 2. Mai 2004 17:05

Re: EOutPutBufferTooSmall- Async Pro
 
Danke noch einmal.

Also werde ich Nummer 2 machen. Also konkret mit Async Pro:
1) Zuerst überprüfe ich mittels "Length" die Größe des zusendenden Strings.
2) Und dann überprüfe ich mit "(ApdComPort.)OutBuffFree", ob Platz im Buffer ist.
3) Wenn ja, dann ist alles OK. Wenn nein, dann füge ich einen StatusTrigger hinzu ("AddStatusTrigger"), der mir meldet, wann wieder Platz ist.

Stimmt meine Denkweise jetzt?

Andy


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz