![]() |
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:
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.
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; 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 |
Re: EOutPutBufferTooSmall- Async Pro
Weiß denn wirklich niemand eine Lösung?
|
Re: EOutPutBufferTooSmall- Async Pro
Zitat:
|
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 |
Re: EOutPutBufferTooSmall- Async Pro
Zitat:
Edit : Sehe gerade den Titel des Threads, tja dann schau mal nach. 8) |
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 |
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:
|
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 |
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:
Wie du siehst wird das Faß bis zu maximal der Hälfte der verfügbaren Reserve gefüllt.
const InBufSize = 8 * 1024;
OutBufSize = 4 * 1024 + 50; HWHandshakeOptions = hfUseRTS or hfRequireCTS; |
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 |
Re: EOutPutBufferTooSmall- Async Pro
Hallo!
Schön langsam bin ich richtig deprimiert, weil ich das jetzt so wie oben beschrieben gemacht habe- ohne Erfolg. Hier der Code (FText ist vom Typ TStrings und ist der Inhalt einer Textdatei). FlowControl habe ich keine eingestellt. Das liegt auch nicht in meiner Macht, da der Benutzer Einstellungen wie Parity, Baud und FlowControl einstellen wird.
Delphi-Quellcode:
Das Problem liegt dabei, dass TriggerStatus nicht aufgerufen wird, obwohl ich es mit der folgender Codezeile zugewiesen habe:
procedure TComPort.SendData;
var I: Integer; begin { Sende FText } try ApdComPort.Open:= TRUE; for I:= LineIndex to FText.Count-1 do begin //LineIndex ist eine Integer var if ApdComPort.OutBuffFree >= Length(FText[I]) then ApdComPort.Output:= FText[I]+#10#13 else begin StatusTrigger:= ApdComPort.AddStatusTrigger(stOutBuffFree); ApdComPort.SetStatusTrigger(StatusTrigger, Length(FText[I]) , TRUE); LineIndex:= I; Break; end; end; finally ApdComPort.Open:= FALSE; end; end; procedure TComPort.TriggerStatus(CP: TObject; TriggerHandle: Word); begin { OnTriggerStatus } if TriggerHandle= StatusTrigger then SendData; end;
Delphi-Quellcode:
[Edit]Ich wäre eigentlich schon glücklich wenn mir jemand zeigen könnte, wie man eine längere (sprich 13 kb) Textdatei mit dem ApdComPort (Async Pro) versendet. Den Rest würde ich mir schon selbst dazubauen. Ich bin schon am verzweifeln. :wall: :wall: [/Edit]
ApdComPort.OnTriggerStatus:= TriggerStatus;
Vielen Dank für eure Hilfe, Andy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz