我正在使用XE8,并试图构建一个我的真实世界应用程序的例子。德尔福-OTL-线程池和工作线程之间的通信
我需要在主“服务线程”和OTL线程池之间进行通信。 这些例子都是用窗体和监视器设置的。我不需要这些,但我无法弄清楚写一个干净的代码的方法。到目前为止,这是我做过什么:
TProcessWorker = Class(TOmniWorker)
strict private
FTaskID : int64;
FIndex : Integer;
FFolder : String;
protected
function Initialize: Boolean; override;
public
procedure WriteTask(var msg : TMessage); message _AM_WriteTask;
End;
{ TProcessWorker }
function TProcessWorker.Initialize: Boolean;
begin
FTaskID := Task.UniqueID;
FIndex := 0;
result := True;
FFolder := Format('%s/%d', [Task.Param['Folder'].AsString, FTaskID]);
ForceDirectories(FFolder);
end;
实现为:
procedure TProcessWorker.WriteTask(var msg: TMessage);
var
ps : PString;
L : TStringStream;
begin
Ps:= PString(msg.LParam);
L := TStringStream.Create(ps^);
try
L.SaveToFile(format('%s\%d.txt',[FFolder, fIndex]));
finally
l.Free;
inc(FIndex);
end;
end;
在主线程,创建池,我打电话:
FThreadPool := CreateThreadPool('Thread pool test');
和
var
lFolder : String;
Process : IOmniWorker;
begin
lFOlder := ExtractFilePath(ParamStr(0));
Process := TProcessWorker.Create;
CreateTask(Process, 'Task test').Unobserved.SetParameter('Folder',lFolder).Schedule(FThreadPool);
我不知道如何正确调用我的工作者线程。在我的真实应用程序中,会触发多个线程,并且我需要确保正确使用线程池。
1)通过像我这样调用CreateTask,我如何正确使用threadpool?为我需要的每个进程调用CreateTask似乎很奇怪。
2)工作线程永远不会被触发。我应该如何让我的工作线程工作! :)
问候, 克莱门特