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 "." :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
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, , tout comme "descendre" la BUFSIZE de 2048 à 256.
Une ou des idée(s) ?
Merci !
Partager