Hallo Theo, hallo Michael,
danke fuer die Hinweise ... mit CoInitializeEx hast natuerlich recht, und ja, ich bin aufgeschmissen, weil es keine vernuenftige Dokumentation des COM-Objects gibt.
Ich habe mal mit folgendem Minimalcode
Code: Alles auswählen
unit ThreadTestMain;
{$mode objfpc}{$H+}
interface
uses
Classes, windows, SysUtils, Forms, StdCtrls, Instrument, comobj, ActiveX;
type
TTestThread = class(TThread)
protected
procedure Execute; override;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
implementation
var
ResultText: string;
procedure TTestThread.Execute;
var
j: integer;
Success: HRESULT;
begin
Success := CoInitializeEx(nil, COINIT_MULTITHREADED);
if (Success <> S_OK) or (Success <> S_FALSE)
then Exception.Create('Not s_ok or s_false');
for j := 1 to 100 do
begin
if AInstrument.SomeStatus then // <-- Strange exceptions from COM-Object at this line
ResultText := ResultText + 'T'
else
ResultText := ResultText + 't';
end;
CoUninitialize;
end;
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
ATestThread: TTestThread;
i: integer;
begin
ATestThread := TTestThread.Create(True);
for i := 1 to 100 do
begin
if AInstrument.SomeStatus then
ResultText := ResultText + 'B'
else
ResultText := ResultText + 'b';
if (i = 23) then
ATestThread.Start;
end;
ATestThread.WaitFor;
if Assigned(ATestThread.FatalException) then
raise Exception.Create(':-(');
FreeAndNil(ATestThread);
Label1.Caption := ResultText;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AInstrument := TInstrument.Create; // AInstrument is global
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(AInstrument);
end;
end.
das Problem reproduzieren koennen. Sehr ihr hier einen offensichtlichen Fehler?
Ich habe ja das COM-Object in AInstrument gekapselt ... und interessanterweise habe ich mit den Threads, die ich in der TInstrument-Klasse starte und die auch das COM-Object verwenden, noch nie Probleme gehabt. Nur wenn ich AInstrument anspreche ...
Danke fuer Euren Input!