multithreading - Delphi - OTL - ThreadPool 和 Worker 线程之间的通信

标签 multithreading delphi threadpool otl

我正在使用 XE8 并尝试构建我的真实应用程序示例。

我需要在主“服务线程”和 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,我如何正确使用线程池?为我需要的每个进程调用 CreateTask 对我来说似乎很奇怪。

2) 永远不会触发工作线程。我应该如何让我的工作线程工作! :)

问候, 克莱门特

最佳答案

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

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

然后您可以使用 <channel>.Send(<message>, <data>) 以“正常”方式发送消息如果您以 Delphi 方式装饰它,它们将被分派(dispatch)到其他任务的消息方法:

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

关于multithreading - Delphi - OTL - ThreadPool 和 Worker 线程之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470815/

相关文章:

ios - 在后台线程中加载 UIImage

java - Copy-On-Write 与直接锁定/同步写入方法有何不同?

arrays - 在 Delphi 中使用动态记录数组与 TList<TMyRecord> 有何优缺点?

c++ - 使用 Boost 线程和 io_service 创建线程池

c# - 允许工作线程在主线程显示对话框时工作

c++ - 使用 std::mutex 避免竞争条件

string - 如何在 Delphi EXE 中加密或隐藏字符串?

delphi - TListView : Subitem order after adding a new column between existing during runtime

c# - 线程池行为 : not growing from minimum size

python - 添加多线程或异步到网络抓取