diff options
author | Erich Eckner <git@eckner.net> | 2015-10-14 11:41:08 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-10-14 11:41:08 +0200 |
commit | 40c01613441abd3d9cec3328ba2aee91b04177b5 (patch) | |
tree | ba43fdc49a38676ab410fbf2a9fa743c6b651bde /lesethreadunit.pas | |
parent | c885f176745cd414a5f4d81fd4c834fde9b8d590 (diff) | |
download | units-40c01613441abd3d9cec3328ba2aee91b04177b5.tar.xz |
lesethreadunit.pas ermöglicht nun nichtblockierendes Lesen
Diffstat (limited to 'lesethreadunit.pas')
-rw-r--r-- | lesethreadunit.pas | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lesethreadunit.pas b/lesethreadunit.pas new file mode 100644 index 0000000..c89c70a --- /dev/null +++ b/lesethreadunit.pas @@ -0,0 +1,86 @@ +unit lesethreadunit; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Process, Math; + +type + tLeseProzess = class + private + prozess: tProcess; + puffer: string; + _anzahl,sollVorrat: longint; + function rAnzahl: longint; + procedure fuelleVorrat; + public + property anzahl: longint read rAnzahl; + constructor create(dateiName: string; vorratsZeilen: longint); + destructor destroy; override; + function gibZeile(out s: string): boolean; + end; + +implementation + +// tLeseThread ***************************************************************** + +constructor tLeseProzess.create(dateiName: string; vorratsZeilen: longint); +begin + inherited create; + + puffer:=''; + _anzahl:=0; + sollVorrat:=vorratsZeilen; + + prozess:=tProcess.create(nil); + prozess.executable:='/usr/bin/tail'; + prozess.parameters.add('-f'); + 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; +const + maxLen = 1024*1024; +begin + while (_anzahl<sollVorrat) and (prozess.output.numBytesAvailable>0) do begin + setlength(s,min(maxLen,prozess.output.numBytesAvailable)); + len:=prozess.output.read(s[1],length(s)); + for i:=1 to len do + _anzahl:=_anzahl+byte(s[i]=#10); + puffer:=puffer+copy(s,1,len); + 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. + |