Bonjour à tous,
En premier lieux je tiens a préciser que mon "problème" n'en n'est pas vraiment un car mon application console fonctionne parfaitement, mais consomme trop de CPU (25% sur ma machine) j'aurais aimé savoir si il y avait un moyen d'optimiser la partie de code suivante (source du problème). Je précise aussi que les pipes ainsi que le createprocess sont dans un thread, et un autre thread prends en charge la lecture du STDIN et remplir le buffer de traitement des pipes(_sendbuf). voici le bout de code :
n'existe t'il pas une méthode qui attends simplement l'arrivée de données sur le pipe et qui déclencherai le reste de la boucle? j'ai des pistes mais rien qui il me semble optimiserai le code. j'ai pensé au WaitForSingleObject ou WaitMessage, mais aucun des 2 n'est probant...
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 repeat GetExitCodeProcess(pi.hProcess, _ExitCode); if (_ExitCode<>STILL_ACTIVE) then _End:=True; PeekNamedPipe(read_stdout, @buf, bufsize, @bread, @avail, nil); if (bread<>0) then begin fillchar(buf, bufsize, 0); if (avail>bufsize) then while (bread>=bufsize) do begin ReadFile(read_stdout, buf, bufsize, bread, nil); SplitLines(buf); fillchar(buf, bufsize, 0); end else begin ReadFile(read_stdout, buf, bufsize, bread, nil); SplitLines(buf); end; end; while (Length(_SendBuf)>0) do begin WriteFile(write_stdin, _SendBuf[1], 1, bread, nil); Delete(_SendBuf, 1, 1); end; until _End;
Quand je parle de l'utilisation CPU je parle bien-sûr au "repos" juste avec un createprocess sur cmd.exe et le thread de lecture de STDIN désactivé...
Si quelqu'un à une solution à proposer je suis preneur...
Partager