ich überwache mit einem Process (erstellt mit CreateProcess) den Output eines Kommandozeilentools.
Dieses liefert bei bestimmten Aktionen des Benutzers einen Output.
Das heisst mein Process muss "ewig" laufen, bis ich ihm sage er kann abbrechen.
Damit meine Gui Anwendung nicht blockiert wird, läuft das ganze in einem Thread.
Bis dahin alles schick.
1. Process starte
2. Process liefert mir soviel Output wie ich anfrage
3. Meine Gui Anwendung ist nicht blockiert.
...bis auf...
Ich benutze im Process ReadFile in einer Schleife. Das Problem, ReadFile hat keinen Timeout, der blockt und wartet solange,
bis Output generiert wird, dann wird die Schleife durchlaufen und das Warten geht von vorne los.
Mein Problem an der Stelle, ich kann im Grunde diese Schleife nicht unterbrechen, um den Process zu stoppen, da ReadFile blockt.
Hier mal ein Auszug:
Code: Alles auswählen
if (FWait) then
begin
while not FTerminateRequest do
begin
AOutput := EmptyStr;
repeat
WasOK := ReadFile(vStdOutPipe.Output, vBuffer^, READ_BLOCKSIZE, vReadBytes, nil);
if (vReadBytes > 0) then
begin
AOutput := AOutput + StrPas(vBuffer);
FireOutput(FName, pstRunning, AOutput);
end;
WaitForSingleObject(vProcessInfo.hProcess, 100);
until not WasOK or (vReadBytes < READ_BLOCKSIZE);
end;
end;
Leider habe ich dahingehend keine Ahnung was umgestellt werden muss?
Wenn jemand ein kleines Beispiel für ein Asynchrones ReadFile hätte wäre ich sehr dankbar.
Gruß
musicones
NACHTRAG:
Vielen Dank für Eure HIlfe. Den Link hatte ich auch gesehen, aber irgendwie nicht so richtig wahrgenommen, der hilft weiter.
Letztendlich sind die Schlüsselworte: NamedPipe, hier CreateNamedPipe (da es mit anonymen Pipes nicht geht) und OVERLAPPED als FILE_FLAG_OVERLAPPED im dwOpenMode Parameter.
Ich hab es noch nicht vollständig korrekt am laufen, aber ich denk ich bin auf dem richtigen Weg jetzt.