Anfügen und 'Nächsten Job holen' müssen geschützt werden. Am Besten Du spendierst deinem Thread zwei Methoden:
Delphi-Quellcode:
Type
TDBThread ...
Private
FCS : TCriticalSection;
Function GetNextJob :
String;
Public
Procedure AddJob (
Const aJob :
String;
...
End;
Function TDBThread.GetNextJob :
String;
Begin
fCS.Enter;
Try
If fJobList.Count>0
Then Begin
Result := fJobList[0];
fJobList.Delete(0)
End
Else
Result := '
';
Finally
fCS.Lave;
End
End;
Procedure TDBThread.AddJob (
Const aJob :
String;
Begin
fCS.Enter;
Try
fJobList.Add(aJob);
// Ich signalisiere hier der Execute-Methode per
Release (fDataAvailSemaphore, 1,
nil);
// das ein Job zur Verarbeitung bereit steht.
// Die Semaphore wird mit
// fDataAvailSemaphore := CreateSemaphore (nil,0,maxint,nil);
// im Konstruktor initialisiert
Finally
fCS.Lave;
End
End;
Procedure TDBThread.Execute;
Begin
CoInitialize();
// Create ADO-Connection
While not Terminated
do Begin
WaitForSingleObject (fDataAvailSemaphore , INFINITE);
If Not Terminated
Then
ExecuteJob (GetNextJob);
End;
CoUninitialize();
End;
Das klassische Designpattern eines Workerthreads.
Hier wird ein Workerthreadpool vorgestellt, an dem man recht gut studieren kann, wie das mit der Synchronisation von Threads funktioniert.