使用计时器在线程和对象中进行流水线操作

时间:2015-01-02 20:55:37

标签: delphi pipeline delphi-xe6

我的应用程序有一个对象,它监视它创建的命令提示符进程的输出和错误。我有两个这样的实现,其中一个在一个线程中运行,另一个使用TTimer组件运行,该组件在再次调用OnTimer事件之前等待50毫秒。

线程方法在任何时候都不会从进程中返回输出/错误文本,而计时器方法确实返回输出/错误文本但不一定是正确的顺序(我怀疑管道中有一个堆积因此为什么我想要使用线程来减少管道检查之间的时间。)

是否有人建议允许我尽可能频繁地监视输出/错误管道,但不是CPU耗尽?

计时器代码:

procedure TCmdPipeliner.OnReadTimer(Sender: TObject);
var
  ReadPipeResult, ErrorPipeResult : string;
begin

  // Read in pipe data
  ReadPipeResult := Self.ReadPipeContent;
  ErrorPipeResult := Self.ErrorPipeContent;

  if (ReadPipeResult <> '') and (Assigned(Self.FOnPipeRead)) then Self.FOnPipeRead(Self, ReadPipeResult);
  if (ErrorPipeResult <> '') and (Assigned(Self.FOnPipeError)) then Self.FOnPipeError(Self, ErrorPipeResult);

end;

线程代码:

procedure TCmdPipeliner.Execute;
var
  ReadPipeResult, ErrorPipeResult : string;
begin

  while not(Self.Terminated) do
    begin

      // Read in pipe data
      ReadPipeResult := Self.ReadPipeContent;
      ErrorPipeResult := Self.ErrorPipeContent;

      if (ReadPipeResult <> '') and (Assigned(Self.FOnPipeRead)) then Self.FOnPipeRead(Self, ReadPipeResult);
      if (ErrorPipeResult <> '') and (Assigned(Self.FOnPipeError)) then Self.FOnPipeError(Self, ErrorPipeResult);

      sleep(1);

    end;
  {end while}

end;

我试图使用&#39;同步&#39;但没有运气;

  if (ErrorPipeResult <> '') then
    if (Assigned(Self.FOnPipeError)) then
      Synchronize(procedure
        begin
          Self.FOnPipeError(Self, ErrorPipeResult);
        end);

  if (ReadPipeResult <> '') then
    if (Assigned(Self.FOnPipeRead)) then
      Synchronize(procedure
        begin
          Self.FOnPipeRead(Self, ReadPipeResult);
        end);

0 个答案:

没有答案