unit lesethreadunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Process, Math; type tLeseProzess = class private prozess: tProcess; puffer,_kopie: string; _anzahl,sollVorrat: longint; function rAnzahl: longint; procedure fuelleVorrat; public property anzahl: longint read rAnzahl; constructor create(dateiName: string; vorratsZeilen: longint); overload; constructor create(dateiName, kopie: string; vorratsZeilen: longint); overload; destructor destroy; override; function gibZeile(out s: string): boolean; end; implementation // tLeseThread ***************************************************************** constructor tLeseProzess.create(dateiName: string; vorratsZeilen: longint); begin create(dateiName,'',vorratsZeilen); end; constructor tLeseProzess.create(dateiName, kopie: string; vorratsZeilen: longint); begin inherited create; puffer:=''; _anzahl:=0; sollVorrat:=vorratsZeilen; _kopie:=kopie; prozess:=tProcess.create(nil); if pos('/dev/',dateiName)=1 then prozess.executable:='/usr/bin/cat' else begin prozess.executable:='/usr/bin/tail'; prozess.parameters.add('-f'); prozess.parameters.add('--lines=+0'); end; prozess.parameters.add(dateiName); prozess.options:=prozess.options + [poUsePipes]; prozess.execute; sleep(100); end; destructor tLeseProzess.destroy; begin prozess.free; puffer:=''; inherited destroy; end; function tLeseProzess.rAnzahl: longint; begin fuelleVorrat; result:=_anzahl; end; procedure tLeseProzess.fuelleVorrat; var s: string; len,i: longint; f: textFile; const maxLen = 1024*1024; begin while (_anzahl0) do begin setLength(s,min(maxLen,prozess.output.numBytesAvailable)); len:=prozess.output.read(s[1],length(s)); while pos(#13,s)>0 do s[pos(#13,s)]:=#10; for i:=1 to len do _anzahl:=_anzahl+byte(s[i]=#10); puffer:=puffer+copy(s,1,len); if _kopie<>'' then begin assignFile(f,_kopie); if not fileExists(_kopie) then rewrite(f) else append(f); write(f,copy(s,1,len)); closeFile(f); end; end; end; function tLeseProzess.gibZeile(out s: string): boolean; begin result:=anzahl>0; if not result then exit; s:=copy(puffer,1,pos(#10,puffer)-1); delete(puffer,1,pos(#10,puffer)); dec(_anzahl); end; end.