1 pièce(s) jointe(s)
Petit souci avec TProcess et la taille du buffer de sortie
Bonjour,
Pour des données pesant 159 octets (c'est variable, c'est pris dans des fontes) et un BUFSIZE défini à 2048, à l'exécution j'ai d'abord un ShowMessage de 15 octets suivi d'un autre ShowMessage du reste, soit 144 octets.
Vous trouvez ça normal, vous ?
Ce code va me servir à récupérer des données qui se suivent, dans les fichiers .ttf et .otf.
Je me suis sans doute fourvoyé quelque part, mais où ?
Je précise que la sortie du TProcess, enregistrée sur le disque et examinée dans un éditeur hexa, ne montre rien d'anormal : toutes les lignes (7) se terminent de la même manière avec le même octet, ".", d'une valeur de "0A".
Pour cet exemple, il s'agit de la fonte LUCON.TTF.
Je mets les deux premières lignes de l'éditeur hexa, puisque le souci est sur la première ligne vous pourrez comparer les deux "." :
Pièce jointe 659391
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| procedure TForm1.Button2Click(Sender: TObject);
const
BUFSIZE = 2048; // Buffer size for reading the output in chunks
var
i: Integer;
AProcess : TProcess; // script.sh
BytesRead : LongInt;
Buffer : array[0..BUFSIZE-1] of char;
begin
for i := 0 to BUFSIZE-1 do Buffer[i] := '0'; // initialisation du buffer
AProcess := TProcess.Create(nil);
with AProcess do begin
Options := [poUsePipes];
Executable := Application.Location+'script.sh';
for i := 0 to 0 do begin // fast test
//for i := 0 to Count-1 do begin // full job
Parameters.Clear;
Parameters.Add(CacheItem.FileName); // le chemin de la fonte + le nom de la fonte
try
AProcess.Execute;
repeat
if Output.NumBytesAvailable > 0 then begin
BytesRead := OutPut.Read(Buffer, BUFSIZE);
ShowMessage(IntToStr(BytesRead)); // d'abord 15 soit 14+1 (1re ligne), puis 144
MemoVisu.Text:= MemoVisu.Text + Copy(Buffer, 1, BytesRead);
end
else
Sleep(1);
until (not Running) and (Output.NumBytesAvailable = 0);
ShowMessage(IntToStr(ExitStatus)+' '+IntToStr(BytesRead)); // 0 144
finally
//
end;
end; // for i...
Free;
end;
MemoVisu.Lines.SaveToFile('/tmp/memovisu.txt'); // clic-droit propriétés --> 159 octets, soit 15 + 144
end; |
La sortie complète, récupérée par le script qui fait tourner un outil de FontForge, et envoyée dans un TMemo :
Code:
1 2 3 4 5 6 7
| Lucida Console
Regular
Lucida Console Regular; B&H alpha25
Lucida Console
Version 1.60
LucidaConsole
Lucida is a registered trademark of Bigelow & Holmes Inc. |
PS : j'ai écrit Buffer: array[0..BUFSIZE-1] of char; mais je vois parfois sur le web la phrase Buffer: array[1..BUFSIZE] of char;. C'est mieux ?
En tout cas (comme je m'en doutais), utiliser l'une ou l'autre formule ne change rien au résultat et au comportement : 2 ShowMessage, :koi:, tout comme "descendre" la BUFSIZE de 2048 à 256. :koi: :koi: :koi:
Une ou des idée(s) ?
Merci !