Thema: Thread in DLL

Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Thread in DLL

  Alt 5. Dez 2013, 20:17
Hallo zusammen,

ich habe zunächst, wie mal gelernt, folgendes in ein Thread in einer DLL implementiert:
Delphi-Quellcode:
unit thr_IO;
interface

uses
  classes,
  Controls,
  ComCtrls,
  StdCtrls,
  sysUtils,
  ExtCtrls;


type
  TThreadInt64 = procedure(iValue: UInt64) of object;

  TthrIO = CLASS(TThread)
    private
      _iDigIn : UInt64;
      procedure synciDigInEvent;
    protected
    public
      constructor Create;
      property iDigInEvent: TThreadInt64 read _iDigInEvent write _iDigInEvent;
   end;

implementation

constructor TthrIO.Create;
begin
  inherited Create(true);
end;

procedure TthrIO.execute;
begin
  while not Terminated do
  begin
    Sleep(100);
    GetDigIn;
  end;
end;

procedure TthrIO.GetDigIn;
begin
  _iDigIn := trunc(frac(now*1000)*100000000000);
  Synchronize(synciDigInEvent); // Hängt sich asf Sobald in DLL . Egal ob Aufruf hier oder in execute
end;

procedure TthrIO.synciDigInEvent;
begin
  if Assigned(_iDigInEvent) then
    _iDigInEvent(_iDigIn);
end;

end.
Die Destrukts habe ich der Übersichtlichkeit halber weg gelassen. Im Quelltext der DLL
Delphi-Quellcode:
library USB1408_DI16;

uses
  Windows,
  SysUtils,
  thr_IO in 'thr_IO.pas';

{$R *.RES}

type
  TUSB1408 = class(TObject)
  private
  public
    iDigIn : UInt64;
    procedure SynciDigIn(iValue:UInt64);
  end;

var
  USB1408 : TUSB1408;
  thrIO : TthrIO;

procedure TUSB1408.SynciDigIn(iValue:UInt64);
begin
  iDigIn := iValue;
end;


function Init:Boolean; export;

begin
  FreeAndNil(thrIO);
  thrIO := TthrIO.Create;

  thrIO.iDigInEvent := USB1408.SynciDigIn;

  thrIO.Resume;
end;

function GetBitIn(iKan:Integer):Boolean;
begin
  { DataValue auf den gewünschten bit abfragen und on/off-Status ermitteln }
  Result:=odd(thrIO.iDigIn1 shr iKan);
end;

exports
  Init,
  GetBitIn;

begin
end.
Es hat ein paar Stunden gedauert, bis ich endlich herausgefunden habe, warum der Thread beim Aufruf von Synchronize(synciDigInEvent) sich aufhängt. /Synchronize in DLL´s nicht zulässig ...)

Folgende beide Möglichkeiten funktionieren dagegen.

Delphi-Quellcode:
library USB1408_DI16;
...
function GetBitIn(iKan:Integer):Boolean;
begin
  { DataValue auf den gewünschten bit abfragen und on/off-Status ermitteln }
  Result:=odd(thrIO._iDigIn shr iKan);
end;
wenn iDigIn im Public-Abschnitt definiert wird, oder
Delphi-Quellcode:
protected
      ...
      function GetiDigIn : UInt64;
    public
      ...
      property iDigIn1: UInt64 read GetiDigIn;
    end;

implementation

function TthrIO.GetiDigIn : UInt64;
begin
  Result := _iDigIn;
end;
und der Aufruf im Quelltext der DLL
Delphi-Quellcode:
library USB1408_DI16;
...
function GetBitIn(iKan:Integer):Boolean;
begin
  { DataValue auf den gewünschten bit abfragen und on/off-Status ermitteln }
  Result:=odd(thrIO.iDigIn1 shr iKan);
end;
Und jetzt wüsste ich gerne, ob das so zulässig ist und welche Methode zu bevorzugen wären und wenn, warum

Vielen Dank
Gerd
  Mit Zitat antworten Zitat