使用IOmniTaskControl / TOmniWorker时如何检查异常?

时间:2016-03-28 15:30:05

标签: delphi delphi-xe5 omnithreadlibrary

我使用IOmniTaskControl / TOmniWorker将代码执行汇集到特定线程上。我将重复使用此IOmniTaskControl进行多次Invoke调用。如何检查Invoke期间可能发生的异常?这是问题/答案的后续问题:Waiting for Invoke to finish when using IOmniTaskControl/TOmniWorker

我已经检查过IOmniTaskControl的ExitCode和FatalException,但是没有设置它们。似乎IOmniTaskControl将为每个Invoke调用自动创建一个新任务,并且异常将被置于该任务上(如果发生)。但是,在完成Invoke之后,我没有参考该任务。我在调用完成时使用TOmniWaitableValue来标记,但不清楚我需要做什么才能在WaitFor(...)返回时发生任何可用的异常。

以下是我所拥有的结构片段:

interface

type
  TMyTaskProc = reference to procedure;

  TMyTask = class
  private
    FWorker:      IOmniWorker;
    FTaskControl: IOmniTaskControl;
    FWaitable:    IOmniWaitableValue;
  public
    constructor Create;
    destructor Destroy; override;

    procedure AwaitInvoke(Proc: TMyTaskProc); overload;
  end;

implementation

type
  TMyTaskWorker = class(TOmniWorker);

constructor TMyTask.Create;
begin
  inherited;

  FWorker := TMyTaskWorker.Create;
  FTaskControl := CreateTask(FWorker).Run;
  FWaitable := TOmniWaitableValue.Create;
end;

destructor TMyTask.Destroy;
begin
  FTaskControl.Terminate;
  FTaskControl := nil;

  FWaitable := nil;

  inherited;
end;

procedure TMyTask.AwaitInvoke(Proc: TMyTaskProc);
begin
  FWaitable.Reset;

  FTaskControl.Invoke(
    procedure
    begin
      try
        Proc();
      finally
        FWaitable.Signal;
      end;
    end
  );

  FWaitable.WaitFor(INFINITE);
end;

因此在上面的设置中,如何在FWaitable.WaitFor(INFINITE)之后检查Proc()调用期间可能发生的任何异常。我想在调用线程中再次提起它。

1 个答案:

答案 0 :(得分:1)

您必须在调用Proc时捕获异常,然后以某种方式通知调用者情况。例如:

jQuery(document).ready(function() {
    jQuery('.nav-menu a[href^="#"]' ).click(function(){
        jQuery.scrollTo( this.hash, 1000, { easing:'swing' });
        return false;
    });
});