在 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;
我有如下基本 类:
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;