This repository has been archived by the owner on Jul 31, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathCompileThread.pas
133 lines (117 loc) · 3.05 KB
/
CompileThread.pas
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{**
DelphiPI (Delphi Package Installer)
Author : ibrahim dursun (ibrahimdursun gmail)
License : GNU General Public License 2.0
**}
unit CompileThread;
interface
uses ProgressMonitor, PackageInfo, MonitoredPackageCompiler, Classes, JclIDEUtils, CompilationData;
type
TCompileThread = class(TThread, IProgressMonitor)
private
FRefCount : integer;
fMonitor : IProgressMonitor;
fCompilationData: TCompilationData;
fCancel: boolean;
fCompiler: TMonitoredPackageCompiler;
procedure SetMonitor(const Value: IProgressMonitor);
procedure SetCancel(const Value: boolean);
protected
procedure Execute; override;
public
constructor Create(const compilationData: TCompilationData);
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
procedure CompilerOutput(const line: string);
procedure Finished;
procedure Log(const text: string);
procedure PackageProcessed(const packageInfo: TPackageInfo;
status: TPackageStatus);
procedure Started;
property Monitor: IProgressMonitor read FMonitor write SetMonitor;
property Cancel: boolean read fCancel write SetCancel;
end;
implementation
constructor TCompileThread.Create(const compilationData: TCompilationData);
begin
inherited Create(true);
Assert(compilationData <> nil);
fCompilationData := compilationData;
end;
procedure TCompileThread.Execute;
begin
inherited;
fCompiler := TMonitoredPackageCompiler.Create(fCompilationData, Self);
try
fCompiler.Compile;
finally
fCompiler.Free;
end;
end;
procedure TCompileThread.Log(const text: string);
begin
Synchronize(procedure
begin
Monitor.Log(text);
end);
end;
procedure TCompileThread.CompilerOutput(const line: string);
begin
Synchronize(procedure
begin
Monitor.CompilerOutput(line);
end);
end;
procedure TCompileThread.Finished;
begin
Synchronize(procedure
begin
Monitor.Finished;
end);
end;
procedure TCompileThread.PackageProcessed(const packageInfo: TPackageInfo;
status: TPackageStatus);
begin
Synchronize(procedure
begin
Monitor.PackageProcessed(packageInfo, status);
end);
end;
procedure TCompileThread.Started;
begin
Synchronize(procedure
begin
Monitor.Started;
end);
end;
procedure TCompileThread.SetCancel(const Value: boolean);
begin
fCancel := Value;
if fCompiler <> nil then
fCompiler.Cancel := true;
end;
procedure TCompileThread.SetMonitor(const Value: IProgressMonitor);
begin
FMonitor := Value;
end;
function TCompileThread.QueryInterface(const IID: TGUID; out Obj): HRESULT;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TCompileThread._AddRef: Integer;
begin
Inc(FRefCount);
Result := FRefCount;
end;
function TCompileThread._Release: Integer;
begin
Dec(FRefCount);
Result := FRefCount;
if Result = 0 then
Destroy;
end;
end.