Das "Warum
DLL" spielt hier doch keine Rolle (persönlich würde ich das auch mit
DLL's/Plugins machen).
Es kommt nur darauf an, wie du das in der
DLL umgesetzt hast.
Als Beispiel nehme ich mal
TSimpleParser
und baue den um, so dass der niemals
threadsafe benutzt werden kann:
Delphi-Quellcode:
unit SimpleParser;
interface
uses
Classes,
Parser;
type
TParserState =
procedure( AChar : Char )
of object;
TSimpleParser =
class( TInterfacedObject, IParser )
private
FBuffer :
string;
FTokens : TStrings;
procedure StartState( AChar : Char );
procedure TokenState( AChar : Char );
public
constructor Create;
destructor Destroy;
override;
function Parse(
const AString :
string ) : TArray<
string>;
end;
implementation
// unit-globale Variable und ich kann threadsafe vergessen
var
FState : TParserState;
{ TSimpleParser }
constructor TSimpleParser.Create;
begin
inherited;
FTokens := TStringList.Create;
end;
destructor TSimpleParser.Destroy;
begin
FTokens.Free;
inherited;
end;
function TSimpleParser.Parse(
const AString :
string ) : TArray<
string>;
var
LIdx : Integer;
begin
FTokens.Clear;
FState := StartState;
for LIdx := 1
to Length( AString )
do
begin
FState( AString[LIdx] );
end;
Result := FTokens.ToStringArray;
end;
procedure TSimpleParser.StartState( AChar : Char );
begin
case AChar
of
'
' :
;
'
,' :
;
else
FState := TokenState;
FState(AChar);
end;
end;
procedure TSimpleParser.TokenState( AChar : Char );
begin
case AChar
of
'
,' :
begin
FTokens.Add( FBuffer );
FBuffer := '
';
FState := StartState;
end;
else
FBuffer := FBuffer + AChar;
end;
end;
end.
Hast du das in der
DLL so ähnlich gelöst, dann kannst du das
threadsafe vergessen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)