Einzelnen Beitrag anzeigen

norwegen60

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

Synchronize blockiert Anwendung

  Alt 6. Dez 2017, 17:03
Hallo zusammen,

ich bin gerade am verzweifeln und bin sicher, dass es nur irgendwo eine Kleinigkeit ist. Ich habe einen Treiber auf das Nötigste zusammengestrichen. Also nicht wundern, dass es etwas sinnfrei wirkt. Das Problem ist, dass ich in einer DLL einen Thread starte. Sobald der aber im Execute-Teill das Synchronize() aufruft, bleibt er an der Stelle hängen. Ursprünglich ist es aus Delphi XE, es hängt aber auch in XE 10.2. Hier der Code

Die dll
Delphi-Quellcode:
library UV;

uses
  SysUtils,
  Windows,
  Classes,
  uProcessUv in 'uProcessUv.pas',
  uThreadUv in 'uThreadUv.pas';

{$R *.res}

exports
  SetCommandW;

end.
Der Prozesshandler
Delphi-Quellcode:
unit uProcessUv;
interface

uses
  uThreadUv;

type
  TProcessUv = class
    procedure Start;
  private
    constructor Create;
    destructor Destroy; override;
    procedure ShowStatus(sValue:String);
  public
  end;

procedure SetCommandW; stdcall;

implementation

uses
  Sysutils;

var
  ThreadUV : TThreadUv;
  ProcessUv: TProcessUv;

procedure SetCommandW; stdcall;
// Erlaubt das Senden von Kommandos als WideString und gibt das Ergebnis ebendfalls als WideString zurück
begin
  if not assigned(ProcessUv) then
  begin
    ProcessUv := TProcessUv.Create;
    ProcessUv.Start;
  end;
end;

constructor TProcessUv.Create;
begin
  inherited;
end;

destructor TProcessUv.Destroy;
begin
  inherited;
end;

procedure TProcessUv.ShowStatus(sValue: String);
// Synchronisert Statusmeldung vom ThreadUVv
begin
// Mach was mit sValue
end;

procedure TProcessUv.Start;
begin
  if not assigned (ThreadUv) then
  begin
    ThreadUv := TThreadUv.Create;
    // ThreadUv.StatusEvent := ProcessUv.ShowStatus;
    ThreadUv.Start;
  end;
end;

end.
Der Threadhandler
Delphi-Quellcode:
unit uThreadUv;
interface

uses
  Classes;

type
  TThreadString = procedure(sValue: String) of Object;

  TThreadUV = class(TThread)
  protected
    procedure Execute; override;
  private
    { Private-Deklarationen }
    FStatus: String;
    FStatusEvent: TThreadString;
    procedure SyncStatusEvent;
  public
    property StatusEvent: TThreadString read FStatusEvent write FStatusEvent;
    constructor Create;
    destructor Destroy; override;
  end;

implementation

{ TThreadUV }

constructor TThreadUV.Create;
begin
  inherited Create(true); // muss auf true stehen damit Aufruf mit Start funktioniert
end;

destructor TThreadUV.Destroy;
begin
  Terminate;
  inherited;
end;

procedure TThreadUV.SyncStatusEvent;
// Übergeordneten Prozess Status mitteilen
begin
  if assigned(FStatusEvent) then
    FStatusEvent(FStatus);
end;

procedure TThreadUV.Execute;
begin
  FStatus := 'So ein Mist';
  Synchronize(syncStatusEvent); // Hier hängt es sich auf

  while not Terminated do
  begin
    sleep(500);
    Terminate;
  end;
end;

end.
und zuletzt der Aufruf
Delphi-Quellcode:
procedure SetCommandW; stdcall; external 'UV.dll';

procedure TForm6.Button1Click(Sender: TObject);
begin
  SetCommandW;
end;
Egal, ob ich an Synchronice etwas assigned habe oder nicht, hängt sich die Anwendung beim Aufruf von Synchronize(syncStatusEvent); auf

Kann mir jemand sagen was ich falsch mache.

Vielen Dank
Gerd
  Mit Zitat antworten Zitat