割り込み可能ライブラリのサポート
割り込み可能ライブラリ
Aspose.Slides 18.4 では、InterruptionToken と InterruptionTokenSource クラスを導入しました。これらは、デシリアライズ、シリアライズ、レンダリングなどの長時間実行タスクを中断できるようにします。
- InterruptionTokenSource は、ILoadOptions::set_InterruptionToken に渡されるトークンの元です。
- ILoadOptions::set_InterruptionToken が設定され、LoadOptions インスタンスが Presentation コンストラクターに渡されると、InterruptionTokenSource::Interrupt() を呼び出すことで、その Presentation に関連付けられた長時間実行タスクが中断されます。
以下のコードスニペットは、実行中のタスクを中断する方法を示しています。
void Run(Action<SharedPtr<IInterruptionToken>> action, SharedPtr<IInterruptionToken> token)
{
auto threadFunction = std::function<void()>([&action, &token]() -> void
{
action(token);
});
auto thread = System::MakeObject<Threading::Thread>(threadFunction);
thread->Start();
}
void Run()
{
String dataDir = GetDataPath();
auto function = std::function<void(SharedPtr<IInterruptionToken> token)> ([&dataDir](SharedPtr<IInterruptionToken> token) -> void
{
auto options = System::MakeObject<LoadOptions>();
options->set_InterruptionToken(token);
auto presentation = System::MakeObject<Presentation>(dataDir + u"sample.pptx", options);
presentation->Save(dataDir + u"sample.ppt", Export::SaveFormat::Ppt);
});
auto action = System::Action<SharedPtr<IInterruptionToken>>(function);
auto tokenSource = System::MakeObject<InterruptionTokenSource>();
Run(action, tokenSource->get_Token()); // 別スレッドでアクションを実行する
Threading::Thread::Sleep(10000); // タイムアウト
tokenSource->Interrupt(); // 変換を停止する
}
FAQ
Aspose.Slides の割り込みライブラリの目的は何ですか?
ロード、保存、プレゼンテーションのレンダリングなど、長時間実行される操作を完了前に中断できる仕組みを提供します。処理時間を制限したい場合やタスクが不要になった場合に便利です。
InterruptionToken と InterruptionTokenSource の違いは何ですか?
InterruptionTokenは Aspose.Slides API に渡され、長時間実行される操作中にチェックされます。InterruptionTokenSourceはコード側でトークンを作成し、Interrupt()を呼び出すことで中断をトリガーします。
どのようなタスクを中断できますか?
InterruptionToken を受け取るすべての Aspose.Slides タスク、たとえば Presentation(path, loadOptions) でのプレゼンテーションのロードや Presentation::Save(...) での保存などが中断可能です。
中断はすぐに行われますか?
いいえ。中断は協調的に行われます。操作は定期的にトークンをチェックし、Interrupt() が呼び出されたことを検出した時点で停止します。
タスクがすでに完了した後に Interrupt() を呼び出すとどうなりますか?
何も起こりません。該当タスクがすでに完了している場合、呼び出しは効果を持ちません。
複数のタスクで同じ InterruptionTokenSource を再利用できますか?
はい。ただし、そのソースで Interrupt() を呼び出すと、そのトークンを使用しているすべてのタスクが中断されます。タスクを個別に管理したい場合は、別々のトークンソースを使用してください。