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