Synkronisering af tråde i en DLL med Delphi 6

Tags:    delphi

Hejsa allesammen,

Her er en lille teknik som jeg lige ville dele med jer. Som nogle måske har fundet
ud af er synkroniseringsmekanismen i Delphi 6 lavet om i forhold til tidligere versioner.
Det medfører at det lige pludselig ikke er særligt trivielt at få en tråd til at synkronisere
når denne kører i en DLL. Det er noget med at Synchronize putter metoderne over i
en buffer, som hovedtråden så skal tømme. Problemet er bare at en DLL ikke har en
hovedtråd, og alle tråde der bliver lavet i en DLL er "undertråde". Det er måske ikke
en helt korrekt opfattelse, men det er noget i den retning.

Jeg har en DLL hvor jeg har mellem 1 og 8 tråde, afhængigt af ydre omstændigheder.
Disse tråde gør principielt det samme og berører de samme ting. Det er derfor nødvendigt
at de bliver synkroniseret.

Jeg lavede derfor en subclass af TThread som tager højde for dette, og det virker. Koden til
denne subclass følger her :

<PRE>
unit DllThread;

interface

Uses
Classes, ExtCtrls;

Type
TDLLThread = class(TThread)
private
CheckTimer : TTimer;

procedure DoSynchronizeCheck(Sender : TObject);
protected
Procedure DllSynchronize(Method : TThreadMethod);
Public
Constructor DllCreate(CreateSuspended: Boolean);
Destructor Destroy; Override;
end;

implementation

{ TDLLThread }

constructor TDLLThread.DllCreate(CreateSuspended: Boolean);
begin
CheckTimer := TTimer.Create(nil);
CheckTimer.Interval := 1;
CheckTimer.Enabled := FALSE;
CheckTimer.OnTimer := DoSynchronizeCheck;

inherited Create(CreateSuspended);
end;

destructor TDLLThread.Destroy;
begin
if Assigned(CheckTimer) then
CheckTimer.Free;

inherited;
end;

procedure TDLLThread.DllSynchronize(Method: TThreadMethod);
begin
CheckTimer.Enabled := TRUE;
Synchronize(Method);
end;

procedure TDLLThread.DoSynchronizeCheck(Sender: TObject);
begin
CheckTimer.Enabled := CheckSynchronize;
end;

end.

</PRE>
---

Thomas
tdue@mail.dk



t