summaryrefslogtreecommitdiff
path: root/lesethreadunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-10-14 11:41:08 +0200
committerErich Eckner <git@eckner.net>2015-10-14 11:41:08 +0200
commit40c01613441abd3d9cec3328ba2aee91b04177b5 (patch)
treeba43fdc49a38676ab410fbf2a9fa743c6b651bde /lesethreadunit.pas
parentc885f176745cd414a5f4d81fd4c834fde9b8d590 (diff)
downloadunits-40c01613441abd3d9cec3328ba2aee91b04177b5.tar.xz
lesethreadunit.pas ermöglicht nun nichtblockierendes Lesen
Diffstat (limited to 'lesethreadunit.pas')
-rw-r--r--lesethreadunit.pas86
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.
+