我对Delphi中的多线程有疑问。
假设我有一个线程,并且有一个类,该类完成了一些工作并且必须具有同步性。我该怎么做?
我进行以下过程(在ThreadClass中):
procedure TThreadClass.SynchProc(P: TProc);
begin
...
Synchronize(TThreadProcedure(P));
...
end;
我从我的类中调用它,该类在Thread中运行,但是...
在过程符号“Synchonization”中,是TThread的一种方法,即对象“(作为TThread的自我)”,但是当我从类中调用proc时,变量“Self”不包含我的ThreadClass对象(我不知道,可能是第二类的对象(在Thread中运行)。分别认为该程序不起作用。
我搜索其他变体(我将我的threadClass对象传递给了第二类对象,并尝试从第二类的过程中调用“同步”过程,但是compiller不想对其进行编译)。
你能帮助我吗?将不胜感激
来自乌克兰的问候
PS对不起,我的英语不好
最佳答案
我不确定自己是否100%理解,但我认为您遇到这样的情况。您有一个TThread
后代,例如TMyThread
。然后该类使用另一个名为TThreadClass
的类,该类不从TThread
派生。您想从Synchronize
方法调用TThreadClass
。
以下是一些选项:
TThread
实例传递给TThreadClass
。这是一个相当残酷的解决方案。现在,只要调用TThreadClass
,Synchronize
就可以对线程做任何事情。 Synchronize
方法的过程变量传递给TThreadClass
。这使TThreadClass
能够执行所需的操作,而不再需要执行其他操作。 TThread.Synchronize
类方法,将nil
传递给第一个参数。 其中,最终选择是最简单的。您可以这样做:
procedure TThreadClass.SynchProc(P: TThreadProcedure);
begin
TThread.Synchronize(nil, P);
end;
请注意,按照问题中的代码传递
TProc
并转换为TThreadProcedure
并不是一个好主意。强制调用者传递正确类型的过程变量。在这种情况下,类型转换是良性的,但是您应该始终避免类型转换。关于multithreading - 来自Delphi类的同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14414678/