@@ -13,7 +13,9 @@ TWorkerThread = class(TThread)
1313 FCurrentTree: TBaseVirtualTree;
1414 FWaiterList: TThreadList;
1515 FRefCount: Cardinal;
16- protected
16+ class procedure EnsureCreated ();
17+ class procedure Dispose ();
18+ strict protected
1719 procedure CancelValidation (Tree: TBaseVirtualTree);
1820 procedure Execute ; override;
1921 public
@@ -33,7 +35,6 @@ procedure ReleaseThreadReference(Tree: TBaseVirtualTree);
3335
3436var
3537 WorkerThread: TWorkerThread = nil ;
36- WorkEvent: THandle;
3738
3839
3940implementation
@@ -47,11 +48,13 @@ implementation
4748 TBaseVirtualTreeCracker = class (TBaseVirtualTree)
4849 end ;
4950
51+ var
52+ WorkEvent: THandle;
5053// ----------------- TWorkerThread --------------------------------------------------------------------------------------
5154
52- procedure AddThreadReference ;
53- begin
54- if not Assigned(WorkerThread) then
55+ class procedure TWorkerThread.EnsureCreated () ;
56+ begin
57+ if not Assigned(WorkerThread) then
5558 begin
5659 // Create an event used to trigger our worker thread when something is to do.
5760 WorkEvent := CreateEvent(nil , False, False, nil );
@@ -61,6 +64,20 @@ procedure AddThreadReference;
6164 // Create worker thread, initialize it and send it to its wait loop.
6265 WorkerThread := TWorkerThread.Create();
6366 end ;
67+ end ;
68+
69+ class procedure TWorkerThread.Dispose ();
70+ begin
71+ WorkerThread.Terminate();
72+ SetEvent(WorkEvent);
73+ WorkerThread := nil ; // Will be freed usinf TThreaf.FreeOnTerminate
74+ CloseHandle(WorkEvent);
75+ end ;
76+
77+
78+ procedure AddThreadReference ;
79+ begin
80+ TWorkerThread.EnsureCreated();
6481 Inc(WorkerThread.FRefCount);
6582end ;
6683
@@ -77,12 +94,7 @@ procedure ReleaseThreadReference(Tree: TBaseVirtualTree);
7794 TBaseVirtualTreeCracker(Tree).InterruptValidation;
7895
7996 if WorkerThread.FRefCount = 0 then
80- begin
81- WorkerThread.Terminate();
82- SetEvent(WorkEvent);
83- WorkerThread := nil ; // Will be freed usinf TThreaf.FreeOnTerminate
84- CloseHandle(WorkEvent);
85- end ;
97+ WorkerThread.Dispose();
8698 end ;
8799end ;
88100
@@ -202,6 +214,8 @@ procedure TWorkerThread.AddTree(Tree: TBaseVirtualTree);
202214 finally
203215 FWaiterList.UnlockList;
204216 end ;
217+
218+ SetEvent(WorkEvent);
205219end ;
206220
207221// ----------------------------------------------------------------------------------------------------------------------
0 commit comments