0

現在、OmniThreadLibrary を試しています。同封されているのは私のコードです:

procedure TMainForm.LongWait;
begin
  Task := Parallel.Future<string>(
    function: string
    begin
      Sleep(10000);
      Result := 'Done';
    end,

  Parallel.TaskConfig.OnTerminated(
    procedure
    begin
      if Task.IsDone then
        MessageDlg('Complete', mtInformation, [mbOK], 0)
      else
        MessageDlg('Exception', mtError, [mbCancel], 0)
    end)
  );
end;

LongWait() を呼び出すと、UI をブロックすることなく正常に動作します。私がやりたいことは次のとおりです。

  • 値を待っている間、バックグラウンドでタスクを実行させます
  • 例外が発生した場合は、メイン スレッドでキャッチする必要があります
  • タスクが完了したかキャンセルされたかをメインスレッドが判断できるようにする

これらすべてを行うノンブロッキング関数を実行することは可能ですか?

前もって感謝します、

V.

編集:質問を追加

4

1 に答える 1

6

let the task run in the background while waiting for the value

いくつかの異なる方法で結果を待つことができます:

  • Task.Value値が計算されるまでブロックする呼び出し。
  • Task.IsDone定期的に呼び出してから、が返されたTask.Valueときに呼び出します。IsDoneTrue
  • Task.TryValue定期的に呼び出します。
  • 終了 ( OnTerminated) ハンドラで値を取得します。

if an exception is raised, I want the main thread to catch it

例外は、コードが将来の結果を読み取るポイントに自動的に転送されます。結果をどこにも読み取っていないのでif assigned(Task.FatalException)OnTerminatedハンドラーで単純に使用できます。(ところで、IsDone終了ハンドラでは常に true になります。)

allow the main thread to determine if the task was completed or cancelled

を使用しTask.IsCancelledます。

OmniThreadLibrary ブックを使用した並列プログラミングの将来の章に記載されているすべてのこと。

于 2013-09-28T11:57:29.450 に答える