我有一些基本课程,如:
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.发布于 2018-08-22 11:21:47
声明您的线程例程与TThreadFunc兼容(按照BeginThread的要求):
function mtd(Parameter: Pointer): Integer;或者,如果您总是将一个Test后代传递给它,您只需将其声明如下:
function mtd(Obj: Test): Integer;https://stackoverflow.com/questions/51965022
复制相似问题