在 BeginThread 方法中传递指向对象的指针

Passing pointer to an object in BeginThread method

我有如下基本 类:

Type
Test = class

end;

TestIpl = class (Test)

end

然后我创建对象:

obj = TestIpl.Create();

现在我想将这个对象传递给 BeginThread,它是这样的:

BeginThread(nil, 0, @mtd, obj, 0, Threadinfo.ThreadId);

在方法中:mtd 我想使用创建的对象,所以我这样转换:

var 
  obj: Test;
begin
obj :=  Test(DataParameter);

我这样做是否正确,但更重要的是。可以这样做吗? 我很担心将指针指向其原始对象的那条线。这样可以吗?

目前,当我想在 testIpl 中使用重载方法时,我得到了 AV。 谢谢

编辑

function mtd(DataParameter: Pointer): DWORD; stdcall;

测试用例

unit Unit2;

interface

Type
  Test = class
  protected
    function Test(): Integer; virtual;
  end;

  TestIpl = class (Test)
  protected
    function Test(): Integer; override;
  end;

procedure TestCase;

implementation

function RunThread(Parameter: Pointer): Integer;
var
  x: Test;
  Rslt: Integer;
begin
  x := Test(Parameter);

  Rslt := x.Test();
end;


procedure TestCase;
var
  test: TestIpl;
  ThreadId: Cardinal;
begin
  test := TestIpl.Create;

  BeginThread(nil, 0, Addr(RunThread), Addr(test), 0, ThreadId);
end;

{ Test }

function Test.Test: Integer;
begin
  Result := 1;
end;

{ TestIpl }

function TestIpl.Test: Integer;
begin
  Result := 2;
end;

end.

声明您的线程例程与 TThreadFunc (as required by BeginThread):

兼容
function mtd(Parameter: Pointer): Integer;

或者,如果您总是将 Test 后代传递给它,您可以简单地声明它:

function mtd(Obj: Test): Integer;