Aspose.Slides中的多线程

介绍

在演示文稿中进行并行工作是可能的(除了解析/加载/克隆),并且大多数情况下运行良好,但在使用库的多个线程时,您可能会在少数情况下获得不正确的结果。

我们强烈建议您在多线程环境中使用单个Presentation实例,因为这可能导致不可预测的错误或故障,这些错误或故障并不易被检测到。

在多个线程中加载、保存和/或克隆Presentation类的实例是不安全的。这种操作被支持。如果您需要执行此类任务,您必须使用多个单线程进程并行操作——每个进程应使用自己的演示文稿实例。

并行转换演示文稿幻灯片为图像

假设我们想将PowerPoint演示文稿中的所有幻灯片并行转换为PNG图像。由于在多个线程中使用单个Presentation实例是不安全的,我们将演示文稿幻灯片拆分为单独的演示文稿,并在并行中将幻灯片转换为图像,每个演示文稿在单独的线程中使用。以下代码示例演示了如何做到这一点。

auto inputFilePath = u"sample.pptx";
auto outputFilePathTemplate = u"slide_{0}.png";
auto imageScale = 2;

auto presentation = MakeObject<Presentation>(inputFilePath);

auto slideCount = presentation->get_Slides()->get_Count();
auto slideSize = presentation->get_SlideSize()->get_Size();

std::vector<std::future<void>> conversionTasks;

for (auto slideIndex = 0; slideIndex < slideCount; slideIndex++) {
    // 将幻灯片i提取到一个单独的演示文稿中。
    auto slidePresentation = MakeObject<Presentation>();
    slidePresentation->get_SlideSize()->SetSize(slideSize.get_Width(), slideSize.get_Height(), SlideSizeScaleType::DoNotScale);
    slidePresentation->get_Slides()->RemoveAt(0);
    slidePresentation->get_Slides()->AddClone(presentation->get_Slide(slideIndex));

    // 在单独的任务中将幻灯片转换为图像。
    auto slideNumber = slideIndex + 1;
    conversionTasks.push_back(std::async(std::launch::async, [slidePresentation = std::move(slidePresentation), slideNumber, outputFilePathTemplate, imageScale]() {
        SharedPtr<IImage> image = nullptr;
        try {
            auto slide = slidePresentation->get_Slide(0);

            auto image = slide->GetImage(imageScale, imageScale);
            auto imageFilePath = String::Format(outputFilePathTemplate, slideNumber);
            image->Save(imageFilePath, ImageFormat::Png);
        }
        catch (Exception e) {
            if(image != nullptr) image->Dispose();
            slidePresentation->Dispose();
        }
    }));
}

// 等待所有任务完成。
for (auto& task : conversionTasks) {
    task.get();
}

presentation->Dispose();