Skip to content

Commit 5d8afe3

Browse files
committed
Preparations for issue #787:
* Moved call to SetEvent() from TBaseVirtualTree.ValidateCache() to TWorkerThread.AddTree() so that we can move WorkEvent variable to implementation section. * Extracted private class procedures EnsureCreated() and Dispose() in TWorkerThread
1 parent f8ec48c commit 5d8afe3

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

Source/VirtualTrees.WorkerThread.pas

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3436
var
3537
WorkerThread: TWorkerThread = nil;
36-
WorkEvent: THandle;
3738

3839

3940
implementation
@@ -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);
6582
end;
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;
8799
end;
88100

@@ -202,6 +214,8 @@ procedure TWorkerThread.AddTree(Tree: TBaseVirtualTree);
202214
finally
203215
FWaiterList.UnlockList;
204216
end;
217+
218+
SetEvent(WorkEvent);
205219
end;
206220

207221
//----------------------------------------------------------------------------------------------------------------------

Source/VirtualTrees.pas

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25575,7 +25575,7 @@ procedure TBaseVirtualTree.UpdateWindowAndDragImage(const Tree: TBaseVirtualTree
2557525575

2557625576
//----------------------------------------------------------------------------------------------------------------------
2557725577

25578-
procedure TBaseVirtualTree.ValidateCache;
25578+
procedure TBaseVirtualTree.ValidateCache();
2557925579

2558025580
// Starts cache validation if not already done by adding this instance to the worker thread's waiter list
2558125581
// (if not already there) and signalling the thread it can start validating.
@@ -25589,7 +25589,6 @@ procedure TBaseVirtualTree.ValidateCache;
2558925589
begin
2559025590
// Tell the thread this tree needs actually something to do.
2559125591
WorkerThread.AddTree(Self);
25592-
SetEvent(WorkEvent);
2559325592
end;
2559425593
end;
2559525594

0 commit comments

Comments
 (0)