我有一个像这样的单位
type
TMyClass = Class(TObject)
private
AnInteger : Integer;
MyThreadHandle : DWORD;
procedure MyPrivateProcedure;
public
procedure MyPublicProcedure;
end;
procedure TMyClass.MyPrivateProcedure;
procedure MyThread; stdcall;
begin
if AnInteger <> 0 then MyPublicProcedure;
end;
var
DummyID: DWORD;
begin
MyThreadHandle := CreateThread(NIL,0,@MyThread,NIL,0, DummyID);
end;
procedure TMyClass.MyPublicProcedure;
begin
AnInteger := 0;
end;
我的目标是拥有一个线程(请不要使用TTthread。),就像它是类的一部分一样,它可以“访问” vars/functions/procedures。此示例失败,因为它无权访问var或过程。这只是一个例子,我知道Integer不能像这样改变。对我来说,有一个线程是该类的一部分很重要。我也尝试将整数作为指针(有效)传递给线程,但是我仍然无法访问该类的过程/函数。有任何想法吗?
最佳答案
线程具有自己的堆栈指针,因此您无法在MyThread
本地过程(声明为BTW错误)中访问局部变量或参数(例如隐藏的Self参数)。此外,如果线程访问外部函数中的变量(包括Self),则不能对线程使用本地过程。而且,如果您将来想使用64位编译器,则不能对任何回调使用本地过程。
在您的情况下,您只需要修复过程的声明并将其移至单元范围(使其成为“独立”过程即可。这使您可以将线程回调参数用于“Self”)。
function MyThread(MyObj: TMyClass): DWORD; stdcall;
begin
if MyObj.AnInteger <> 0 then
MyObj.MyPublicProcedure;
Result := 0;
end;
procedure TMyClass.MyPrivateProcedure;
var
DummyID: DWORD;
begin
MyThreadHandle := CreateThread(nil, 0, @MyThread, Self, 0, DummyID);
end;
关于multithreading - 没有TThread的情况下如何从线程过程访问类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10928964/