Hallo beisammen,
am 1.1 wurde über die Paketverwaltung von Debian (Squeeze) die neue FPC- und Lazarus-Verson installiert. Seit dem habe ich ein kleines Problem mit Write/WriteLn.
Bei dem Programm handelt es sich um eine CGI-Anwendung und die Ausgabe der Daten erfolgt innerhalb einer Bibliothek. Wird diese geschlossen, werden die Ausgabedaten, die sich noch im Puffer (8KB?) befinden, verworfen, sodaß der ausgegebene HTML-Text nicht vollständig ist.
Meine Frage wäre also, wie kann ich vor dem Beenden der Bibliothek den Ausgabepuffer senden? Ein Flush(StdOut) hat leider nicht funktioniert. Bei einem normalen Programm gibt es dieses Problem nicht, sondern scheinbar nur bei einer Bibliothek.
Debian Bibliothek Write/WriteLn
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: Debian Bibliothek Write/WriteLn
Warum nutzt du WriteLn in einer Bibliothek? Das sollte/dürfte eigentlich gar nicht gehen, da es alleinige Aufgabe des Programms sein sollte. (sonst würde im Streamdump des ffmpeg-Decoders auf einmal Fehlermeldungen irgendwelcher Libs erscheinen).
Die saubere Lösung wäre eigentlich, dass die Bibliothek einen Verweis auf eine writeln-Funktion geliefert bekommt, die sie benutzen soll (am besten noch mit Kontext-Zeiger, der mit übergeben wird.)
Die saubere Lösung wäre eigentlich, dass die Bibliothek einen Verweis auf eine writeln-Funktion geliefert bekommt, die sie benutzen soll (am besten noch mit Kontext-Zeiger, der mit übergeben wird.)
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Debian Bibliothek Write/WriteLn
Mache der flush in der Bibliothek. Heute haben mainprogram und .so beiden ein eigenes RTL.
Re: Debian Bibliothek Write/WriteLn
Danke erstmal für die Antworten.

Wenn ich im Anschluß noch 8000 Leerzeichen ausgebe, wird der gesamte HTML-Text geliefert. DAS nenne ich schmutzige Programmierung
Habe ich allerdings auch nur lokal und zum Testen drin. War mir erst nicht sicher, ob es tatsächlich am Write(Ln)-Puffer lag.
Nachtrag: Ich habe es gefunden
Der Satz von carli mit den Fehlermeldungen hat mich daran erinnert, daß diese ja nicht über den normalen Ausgabe geliefert werden. Mein Fehler war, daß ich die falsche Datei angegeben habe. Anstatt Flush(StdOut) muß Flush(Output) ausgeführt werden - dann ist das so, wie es immer war.
Funktioniert aber schon seit Jahren sehr gut. Das Hauptprogramm hat nur die Aufgabe, die Bibliothek einzubinden und gibt sofort die gesamte Steuerung an diese ab. Das mit der sauberen Lösung werde ich ausprobieren, auch wenn ich die direkte Verwendung von WriteLn in der Bibliothek nicht dreckig finde.Warum nutzt du WriteLn in einer Bibliothek? Das sollte/dürfte eigentlich gar nicht gehen, da es alleinige Aufgabe des Programms sein sollte.
Genau davon bin ich ausgegangen und Flush wird direkt nach der letzten Ausgabe innerhalb der Bibliothek aufgerufen. Aber irgendwie flusht da nixMache der flush in der Bibliothek. Heute haben mainprogram und .so beiden ein eigenes RTL.

Wenn ich im Anschluß noch 8000 Leerzeichen ausgebe, wird der gesamte HTML-Text geliefert. DAS nenne ich schmutzige Programmierung

Nachtrag: Ich habe es gefunden
