Lies mal die Hilfe zu TThread.Synchronize(). Was du vor hast, macht man in der Regel mit CriticalSections, und wessen Member die versorgende Methode letztlich ist, hängt davon nicht ab. CriticalSections stellen sicher, dass zwei Threads (in deinem Fall Mainthread und dein Workerthread) Code nicht gleichzeitig ausführen können, der zwischen dem Einstieg und dem Ausstieg aus der CriticalSection steht. Genutzt wird soetwas zum Beispiel, wenn ein Thread eine Liste eines anderen befüllt. Sowohl der schreibende als auch der lesende Zugriff müssen dabei dann gegeneinander verriegelt werden. Pseudocode:
Delphi-Quellcode:
// Workerthread
procedure TWorkerThread.Execute;
begin
while not Terminated do
begin
if not List.IsEmpty then
begin
MyCriticalSection.Enter;
try
DoSomethingWith(List[0]);
List.Delete(0);
finally
MyCriticalSection.Leave;
end;
end;
end;
end;
procedure TWorkerThread.AddListItem(aListItem: TListItem);
begin
MyCriticalSection.Enter;
try
List.Add(aListItem);
finally
MyCriticalSection.Leave;
end;
end;
// Hauptthread
procedure TForm1.OnButton1Click(Sender: TObject);
begin
WorkerThread.AddListItem(TListItem.Create(foo, bar));
end;
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)