我使用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()调用期间可能发生的任何异常。我想在调用线程中再次提起它。
答案 0 :(得分:1)
您必须在调用Proc时捕获异常,然后以某种方式通知调用者情况。例如:
jQuery(document).ready(function() {
jQuery('.nav-menu a[href^="#"]' ).click(function(){
jQuery.scrollTo( this.hash, 1000, { easing:'swing' });
return false;
});
});