我一直在使用c ++,而且我不擅长Delphi(XE)。但是有理由,我必须将我的c ++代码移植到Delphi来实现以下任务。我有一个主要的TForm,我从别人那里获得了代码。在TForm中,我定义了2个私有对象和过程来完成某项任务。我的任务是创建一个线程来调用这些类和过程进行一些计算。
TASKForm = class(TForm)
private
MonitorA :TMonClassA;
ConstB :TConstClassB;
procedure calculateStmp;
end;
如果我使用多继承扩展TASKForm,那么可以在c ++中轻松完成此任务。但经过一些研究,我发现德尔福并不支持这一点。所以我需要考虑其他方式。然后我看到一篇关于使用嵌套类的文章。
TASKForm = class(TForm)
protected
TMyThread = class(TThread)
public
procedure Execute(); override; // inside this I need to call TASKForm.MonitorA.somemethod, TASKForm.ConstB.somemethod and TASKForm.calculateStmp
end
private
MonitorA :TMonClassA;
ConstB :TConstClassB;
procedure calculateStmp;
end;
但我很快发现嵌套类中定义的过程无法访问容器的私有成员。我想知道是否还有其他方法可以创建一个线程来调用一个类的私有函数和变量?感谢。
代码已更新。我正在尝试另外两个方案。第一个是使用类似
的界面TmyThread = interface(TThread)
end;
TASKForm = class(TForm, TmyThread)
private
MonitorA :TMonClassA;
ConstB :TConstClassB;
procedure calculateStmp;
end;
但它不起作用,因为TThread不是一种接口。我正在尝试使用Application.ProcessMessages,如下所示
procedure TASKForm.RunMyTask;
while (not RunTerminated) do // RunTerminated will be set when an external event triggered
begin
MonitorA.Somemethod;
calculateStmp;
ConstB.Somemethod;
Application.ProcessMessages;
end;
end
我会说这种方法是" ok"但不完美,因为MonitorA.Somemethod和ConstB.Somemethod可能需要很长或很短的时间才能运行(时间不是常数)所以有时当外部事件触发设置RunTerminated True时,它不会立即终止while循环。我仍然在寻找多线程的方法。
答案 0 :(得分:0)
步骤1.使用回调程序创建TThread的后代 - 像这样
MyTask.MyOnExecute := MyPrivateActions;
步骤2像以前一样创建你的TForm后代。
TMyThread.OnExecute;
begin
if assigned( fMyOnExecute ) then
begin
fMyOnExecute( self );
end;
end;
在某处,可能在TaskForm.Create中或者在线程启动时将MyPrivateActions分配给MyTask.MyOnExecute
R
最后,TMyThread OnExecute看起来像这样
<-
关键是虽然线程正在执行该函数,但该函数属于表单,可以访问自己的私有成员。