Hallo Leute, ich bin neu hier bei Delphi-PRAXIS und hoffe, dass ihr mir mit diesem Problem weiterhelfen könnt. Ich muss zur Zeit eine
ActiveX Komponente entwickeln und habe Probleme bei der Verwendung von Threads in
ActiveX. In einer normalen Delphi Komponente tritt dieses Problem nicht auf.
Ich habe eine Delphi Komponente geschrieben, die eine Methode (StartThread) beinhaltet welche einen Thread (CamThread) startet. Dieser Thread löst alle 100ms Sekunden, über die Methode (UpdateLabel) einen Event aus. So weit funktioniert das ganze auch ohne Probleme. Wenn ich allerdings die Komponente in eine
ActiveX Komponente umwandel funktioniert der Thread nicht mehr. Es kommen keine Events mehr alle 100ms aus der Komponente. Um sicherzugehen, dass es nicht die Events sind, die Probleme bereiten, habe ich noch eine Funktion hinzugefügt (StartEvent), die einen einzelnen Event auslöst. Diese funktioniert. Nur eben der Thread scheint in der Active X Komponente nicht zu laufen . Hier der Code:
Delphi-Quellcode:
interface
uses
Windows, Messages, SysUtils, Classes, Controls;
type
TCameraResultEvent = procedure(Sender: TObject) of object;
TLTB = class(TWinControl)
private
FOnCameraResult: TCameraResultEvent;
{ Private-Deklarationen }
protected
public
constructor Create(Owner: TComponent); override;
procedure StartEvent;
procedure StartThread;
published
property OnCameraResult : TCameraResultEvent
read FOnCameraResult write FOnCameraResult;
end;
PTestRecord =^ TTestRecord;
TTestRecord = record
amin,amax,bmin,bmax,intensity,blueshift: Integer;
end;
CamThread = class(TThread)
private
procedure UpdateLabel;
public
constructor Create(CreateSuspended :boolean; TwinC: TLTB);
protected
procedure Execute; override;
end;
procedure Register;
var
List : TList;
Thread : CamThread;
TWin : TLTB;
implementation
constructor TLTB.Create(Owner: TComponent);
begin
inherited Create(Owner); // Geerbten Konstruktor aufrufen.
List := TList.Create;
Thread := CamThread.Create(true,self);
end;
procedure CamThread.UpdateLabel;
begin
TWin.StartEvent;
end;
constructor CamThread.Create(CreateSuspended :boolean; TwinC: TLTB);
begin
inherited Create(CreateSuspended);
TWin := TwinC;
end;
procedure CamThread.Execute;
var
i: integer;
begin
for i:=0 to 100000 do begin
Synchronize(UpdateLabel);
sleep(100);
end;
end;
procedure TLTB.StartThread;
begin
Thread.Resume;
end;
procedure TLTB.StartEvent;
var i : integer;
begin
if Assigned(FOnCameraResult) then FOnCameraResult(self);
end;
procedure Register;
begin
RegisterComponents('Beispiele', [TLTB]);
end;
end.
Ich würde mich riesig freuen
, wenn mir da jemand weiterhelfen kann.
MfG Micha