AsyncCalls を使用している場合、どのようにして例外をメイン スレッドに入れるのが最善でしょうか? 例えば:
procedure TUpdater.needsToGoFirst();
begin
asyncCall := TAsyncCalls.Invoke(procedure
begin
//some stuff
if (possiblyTrueCondition = True) then
raise Exception.Create('Error Message');
//more stuff
TAsyncCalls.VCLSync(procedure
begin
notifyUpdates();
end);
end);
end;
procedure TUpdater.needsToGoSecond();
begin
asyncCall2 := TAsyncCalls.Invoke(procedure
begin
//initial stuff
asyncCall.Sync();
//stuff that needs to go second
TAsyncCalls.VCLSync(procedure
begin
notifyUpdates();
end);
end);
end;
呼び出すasycCall.Sync
と例外がスローされることはわかっていますが、現在スレッドに更新が行われたことをメインスレッドに通知させる方法により、メインスレッドで呼び出している場所が実際にはありませんSync
。Sync
最初のスレッドが最初に処理する必要があるリソースを取得する前に、いくつかの設定を確認するために呼び出している別のスレッドが実際にあるため、そうするのも難しいことがわかります。
これらの関数の内部を try-catch でラップし、 a を使用VCLSync
してメイン スレッドへの例外を自分で取得する必要がありますか? ある種のメインスレッドのアイドルループで例外をチェックするより良い方法はありますか?
編集 1
私が持っていた別の考えは、すべての投稿でそのコードを複製するのではなく、IAscynCall 参照で例外をチェックし、それを使用してメイン スレッドに例外を発生させることだけを行うループを作成することでした。needsToGoSecond
メソッドはまだ最初に例外に到達する可能性がありますが、その後例外を保持し、ループはそこで例外をキャッチします。