De thread start altijd in de achtergrond daar hoef je niet verder niets aan te doen. Om hem maar 1 keer te starten en daarna meerdere keren te gebruiken doe je meestal het makkelijkst door het werk niet direct aan de thread aan te bieden maar aan een queue en de thread de inhoud van de queue te laten verwerken.
Er zijn vrij veel verschillende technieken. Eea hangt af van hoe je de data aan wilt/kunt bieden aan de thread. Een makkelijke gebaseerd op de message queue is
Code:
...
const
WM_REQUEST = WM_USER + 1;
WM_INFORM = WM_USER + 4;
...
PWerkRec = ^AWerkRec;
AWerkRec = record
A : String;
B : String;
C : Integer;
End;
...
PostThreadMessage(Consumer.ThreadID, WM_REQUEST, 0, Integer(WerkRec));
...
procedure TConsumerThread.Execute;
var
Msg: TagMsg;
Werk : PWerkRec;
begin
... make alle database componenten aan...
while (GetMessage(Msg, 0, 0, 0)) and (not terminated) do
begin
Case Msg.message of
WM_REQUEST : Begin
Werk := PWerk(Msg.LParam);
.. do wat met het werk...
End;
WM_INFORM : Begin
.. do wat anders
end;
else
Begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
end;
end;
end;
Bookmarks