1.6. 非同期処理

非同期処理 API

Pia における処理には、完了までに長い時間を要するものがあります。このような処理を実行する際に、API 呼び出しがブロックしてしまうのを防ぐ目的で、非同期処理 API が用意されています(名前の末尾に「Async」がついています)。非同期処理 API 自体の呼び出しはすぐに返りますが、バックグラウンドでは非同期に処理が進行しており、しばらく時間が経過してから処理が完了します。非同期処理 API の完了をチェックするには、対応する完了チェック用 API (Is*Completed())を使用します。非同期処理の結果を取得するには、結果取得用 API (Get*Result())を使用します。

警告:

非同期処理の完了待ちの間は、その処理に必要な各ディスパッチ API を呼ぶ必要があります。また、非同期処理を行うスレッドに処理時間が割り当てられるように、スレッドのスリープを適切に行う必要があります。

 以下にコード例を示します。

コード 1-5. 非同期処理 API の例
nn::pia::Result result = nn::pia::session::Session::GetInstance()->JoinSessionAsync(&sessionSetting);
if (result.IsFailure()) {
    // エラー処理
    ...
}

// 非同期処理の完了を待つ
while (!nn::pia::session::Session::GetInstance()->IsJoinSessionCompleted()) {
    NexDispatch();
    PiaDispatch();
    Sleep(10);
    ...
}
result = nn::pia::session::Session::GetInstance()->GetJoinSessionResult();

非同期処理のキャンセル

Pia の非同期処理 API の中には、処理を途中でキャンセルするためのキャンセル用 API(Cancel*Async())が用意されているものがあります。ただし、キャンセル用 API を呼んでも即時に処理が完了するわけではありません。アプリケーションはキャンセル処理が完了するまで、非同期処理の完了を待つ必要があります。

非同期処理が短時間で完了する API については、基本的にキャンセル用 API を用意していません。キャンセル用 API が用意されていない API の非同期処理を終了したい場合は、通常通り、非同期処理の完了を待ってから終了処理を行う必要があります。

警告:

キャンセル処理の完了待ちの間は非同期処理の完了待ちの間と同様にその処理に必要な各ディスパッチ API を呼ぶ必要があります。また、キャンセル処理を行うスレッドに処理時間が割り当てられるように、スレッドのスリープを適切に行う必要があります。

 以下にコード例を示します。

コード 1-6. 非同期処理のキャンセルの例
nn::pia::Result result = nn::pia::session::Session::GetInstance()->JoinSessionAsync(&sessionSetting);
if (result.IsFailure()) {
    // エラー処理
    ...
}
 
// 非同期処理の完了を待つ
while (!nn::pia::session::Session::GetInstance()->IsJoinSessionCompleted()) {
    // ユーザー入力などでキャンセル
    if (IsTriggeredCancel()) {
        nn::pia::session::Session::GetInstance()->CancelJoinSessionAsync();
        // 以降のディスパッチでキャンセル処理が進められます
        // キャンセル処理が完了したら IsJoinSessionCompleted() が true を返します
    }
    NexDispatch();
    PiaDispatch();
    Sleep(10);
    ...
}
result = nn::pia::session::Session::GetInstance()->GetJoinSessionResult();