multithreading - 没有TThread的情况下如何从线程过程访问类的成员?

标签 multithreading delphi

我有一个像这样的单位

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/

相关文章:

xml - 我如何使用 TXMLDocument 将版本和编码添加到 xml 文件

delphi - Delphi中如何引发异常?

string - 在 Delphi 中,我如何创建一个带有空分隔符的字符串

python - 'DupFd' 中的属性错误 'multiprocessing.resource_sharer' | Python 多处理 + 线程

java - 为什么 ArrayList 从多个线程修改时不抛出 ConcurrentModificationException?

java - Java 是抢占式的吗?

c - fork之后,父子进程是否共享pipe创建的文件描述符?

java - 释放 "synchronized"锁

delphi - 当设置为 500 毫秒时,*某些* PC 上的 TCP 连接超时为 20 或 21 秒

delphi - 将 SID 转换为名称