割り込み可能なライブラリのサポート

割り込み可能なライブラリ

InterruptionTokenおよびInterruptionTokenSourceクラスがAspose.Slides for C++に追加されました。これらの型は、デシリアライズ、シリアライズ、またはレンダリングなどの長時間実行されるタスクの割り込みをサポートします。InterruptionTokenSourceは、LoadOptions.set_InterruptionToken()メソッドに渡されるトークンまたは複数のトークンのソースを表します。割り込みトークンが設定され、LoadOptionsインスタンスがPresentationコンストラクタに渡されると、このプレゼンテーションに関連する長時間実行されるタスクは、InterruptionTokenSource.Interrupt()メソッドが呼び出されるときに割り込まれます。

以下のコードスニペットは、実行中のタスクを割り込む方法を示しています。

void Run(Action<SharedPtr<IInterruptionToken>> action, SharedPtr<IInterruptionToken> token)
{
    auto thread_function = std::function<void()>([&action, &token]() -> void
    {
        action(token);
    });

    auto thread = System::MakeObject<Threading::Thread>(thread_function);
    thread->Start();
}

void Run()
{
    String dataDir = GetDataPath();

    auto function = std::function<void(SharedPtr<IInterruptionToken> token)> ([&dataDir](SharedPtr<IInterruptionToken> token) -> void
    {
        SharedPtr<LoadOptions> options = System::MakeObject<LoadOptions>();
        options->set_InterruptionToken(token);

        SharedPtr<Presentation> presentation = System::MakeObject<Presentation>(dataDir + u"pres.pptx", options);
        presentation->Save(dataDir + u"pres.ppt", Export::SaveFormat::Ppt);
    });
    auto action = System::Action<SharedPtr<IInterruptionToken>>(function);

    auto tokenSource = System::MakeObject<InterruptionTokenSource>();
    // 別スレッドでアクションを実行する
    Run(action, tokenSource->get_Token());
    // タイムアウト
    Threading::Thread::Sleep(5000);
    // 変換を停止
    tokenSource->Interrupt();
}