Hallo Leute, ich bin neu hier im Forum 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:
Ich würde mich riesig freuen , wenn mir da jemand weiterhelfen kann.
MfG Tanja
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:
Code:
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; CamThread = class(TThread) private procedure UpdateLabel; public constructor Create(CreateSuspended :boolean; TwinC: TLTB); protected procedure Execute; override; end; procedure Register; var Thread : CamThread; TWin : TLTB; implementation constructor TLTB.Create(Owner: TComponent); begin inherited Create(Owner); // Geerbten Konstruktor aufrufen. 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.
MfG Tanja