【问题标题】:IOmniPipeline - 2nd stage is not getting executedIOmniPipeline - 第二阶段未执行
【发布时间】:2021-06-05 15:11:52
【问题描述】:

我有一个简单的管道 (IOmniPipeline) 实现,但添加的第二阶段没有被执行。

代码如下:

 var
  OmniPipeline: IOmniPipeline;

 begin
  OmniPipeline := Parallel.Pipeline;
  OmniPipeline.Stage(DoDataTransfer_A); 
  OmniPipeline.Stage(DoDataTransfer_B); // <---- This stage is not being executed!
  OmniPipeline.OnStop(DataTransferCompleteEvent).Run;
  OmniPipeline.input.Add(nil);
  OmniPipeline.input.CompleteAdding;


procedure DoDataTransfer_A(const input: TOmniValue; var output: TOmniValue);
begin
 //some code here
end;

procedure DoDataTransfer_B(const input: TOmniValue; var output: TOmniValue);
begin
 //some code here
end;

我希望程序DoDataTransfer_B 应该在DoDataTransfer_A 完成后立即执行(这些方法的实现很简单,我没有将它们包含在问题中)。

如果您能指出问题所在以及如何解决,我将不胜感激。

【问题讨论】:

  • 你能发布一个完整的例子吗?也许 DoDataTransfer_A 失败了,谁知道呢?
  • @whosrdaddy 我可以确认DoDataTransfer_A 程序正在正确完成,因为它已在内部登录,并且我看到它正在完全执行。我已更新问题以添加 2 个过程的方法签名。
  • 我猜你的问题是你失去了对阶段A中间管道的引用,这导致它在阶段A完成后销毁,因此不会继续阶段B。是OmniPipeline a某些过程的局部变量?尝试在退出过程之前输入OmniPipeline.WaitFor(INFINITE);

标签: delphi delphi-10.2-tokyo omnithreadlibrary


【解决方案1】:

“我希望 DoDataTransfer_A 完成后立即执行过程 DoDataTransfer_B。”

不,阶段不必按顺序执行 - 它们可以同时执行,这是使用管道的要点之一。 DoDataTransfer_B 将在您传递输入后立即执行,即:

procedure DoDataTransfer_A(const input: TOmniValue; var output: TOmniValue);
var
  InputItem: TOmniValue;
begin
  ....
  Output.Add(InputItem); // InputItem could be input param directly, or any other input
end;

我怀疑你没有这样做。因此,显示您的编码将是相关的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多