汎用非同期タスク ラッパー
このトピックでは、汎用非同期タスク ラッパーの例を示します。 手動で非同期ブロックをセットアップして、各タスクの XAsyncRun を呼び出す代わりに、RunTask
ラッパーを作成してこのプロセスを簡略化することができます。 このラッパーを使用すると、タスク キュー、処理、およびオプションの完了コールバックを指定することができます。
void RunTask(XTaskQueueHandle taskQueue,
std::function<void()> workCallback,
std::function<void()> completionCallback)
{
struct RunTaskContext
{
std::function<void()> workCallback;
std::function<void()> completionCallback;
};
RunTaskContext* context = new RunTaskContext();
context->workCallback = workCallback;
context->completionCallback = completionCallback;
XAsyncBlock* async = new XAsyncBlock{};
async->queue = taskQueue;
async->context = context;
async->callback = [](XAsyncBlock* async)
{
RunTaskContext* context = static_cast<RunTaskContext*>(async->context);
context->completionCallback();
delete context;
delete async;
};
// Callback passed to XAsyncRun is the work callback
XAsyncRun(async,
[](XAsyncBlock* async)->HRESULT
{
RunTaskContext* context = static_cast<RunTaskContext*>(async->context);
context->workCallback();
return S_OK;
});
}
前のサンプルでは、1 つの非同期ブロックと 2 つのコールバック (処理が 1 つと完了が 1 つ) を受け取る関数が実装されています。 完了コールバックはオプションなので、処理コールバックだけを受け取るバージョンを記述することもできます。
このサンプルでは、標準パターンを使用して、非同期ブロックとコンテキスト データをセットアップし、XAsyncRun を呼び出します。
RunTask
によって定型コードをカプセル化して、簡単なスタンドアロンのタスク関数を作成します。 簡単なデータ キャプチャでは、std::function
を使用して、コンテキスト パラメーターなしでコールバックに移動します。
RunTask(taskQueue,
[]()
{
// Work Callback
},
[]()
{
// Completion Callback
});