summaryrefslogtreecommitdiff
path: root/lesethreadunit.pas
blob: 1d7f4d80e91571ae8142b9dab7e4b35e68314b5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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 (_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);
    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.