2015-05-26 33 views
2

我正在使用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)工作线程永远不会被触发。我应该如何让我的工作线程工作! :)

问候, 克莱门特

回答

0

检查http://otl.17slon.com/book/doku.php?id=book:howto:connectionpool

我的感觉是,OTL是基于数据的容器,而不是线程。

所以我认为你需要创建一个任务请求的队列,你的“主线程”将注入任务。

池的想法是,他们管理自己!你不应该与特定的工作线程进行通信,你只需要将工作请求发送给它,然后让该池产生/杀死工作线程,因为它认为合适。

如果您需要每个特定线程的反馈,我宁愿将TForm.Handle或TOmniMonitor指针包含到任务请求记录中,并使工作线程回调并与表单通信,否则线程

0

OmniThreadLibrary测试08_RegisterComm显示如何在两个线程之间直接通信。

基本上,您必须创建IOmniTwoWayChannel的实例,并在工作人员的Initialize方法中使用Task.RegisterComm(<channel>)注册其端点。

然后,您可以发送邮件在“正常”的方式与<channel>.Send(<message>, <data>),他们将被分派到其他任务的消息的方法,如果你在德尔福的方式装饰它:

procedure MessageHandler(var msg: TOmniMessage); message <message>;