[gelöst:]ReadFile blockt. Beispiel für asynchrones Readfile?

Antworten
musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

[gelöst:]ReadFile blockt. Beispiel für asynchrones Readfile?

Beitrag von musicones »

Hallo,

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;
 


Das Problem ist bekannt und als Lösung wird gegeben, das ganze Asynchron zu durchlaufen.
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.
Zuletzt geändert von musicones am Fr 1. Aug 2014, 22:12, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ReadFile blockt. Beispiel für asynchrones Readfile?

Beitrag von theo »


mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: ReadFile blockt. Beispiel für asynchrones Readfile?

Beitrag von mse »

Dann gäbe es noch tpipereader, dort läuft die read-Operation in einem thread und benötigt kein polling.

Antworten