# C++용 Aspose.Slides의 멀티스레딩

> C++용 Aspose.Slides 멀티스레딩은 PowerPoint 및 OpenDocument 처리 속도를 높입니다. 효율적인 프레젠테이션 워크플로우를 위한 모범 사례를 확인하십시오.

Source: https://docs.aspose.com/slides/ko/cpp/multithreading/
Updated: 2026-06-14

## **소개**

프레젠테이션을 사용한 병렬 작업이 가능하고 (구문 분석/로드/클론을 제외하고) 대부분 잘 작동하지만, 라이브러리를 여러 스레드에서 사용할 경우 잘못된 결과가 나올 가능성이 조금 있습니다.

멀티스레드 환경에서 단일 [Presentation](https://reference.aspose.com/slides/ko/cpp/class/aspose.slides.presentation) 인스턴스를 사용하지 **않을** 것을 강력히 권장합니다. 이는 예측할 수 없는 오류나 쉽게 감지되지 않는 실패를 초래할 수 있기 때문입니다.

[Presentation](https://reference.aspose.com/slides/ko/cpp/class/aspose.slides.presentation) 클래스의 인스턴스를 여러 스레드에서 로드, 저장 및/또는 복제하는 것은 **안전하지** 않습니다. 이러한 작업은 **지원되지** 않습니다. 해당 작업을 수행해야 한다면 여러 개의 단일 스레드 프로세스를 사용하여 작업을 병렬화해야 하며, 각 프로세스는 자체 프레젠테이션 인스턴스를 사용해야 합니다.

## **프레젠테이션 슬라이드를 병렬로 이미지로 변환**

PowerPoint 프레젠테이션의 모든 슬라이드를 병렬로 PNG 이미지로 변환한다고 가정해 보겠습니다. 여러 스레드에서 단일 `Presentation` 인스턴스를 사용하는 것은 안전하지 않으므로, 프레젠테이션 슬라이드를 별개의 프레젠테이션으로 나누고 각 슬라이드를 별도 스레드에서 이미지로 변환합니다. 다음 코드 예제가 이를 수행하는 방법을 보여줍니다.

```cpp
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();
```

## **FAQ**

**모든 스레드에서 라이선스 설정을 호출해야 합니까?**

아니요. 스레드가 시작되기 전에 프로세스/앱 도메인당 한 번만 하면 충분합니다. [라이선스 설정](/slides/ko/cpp/licensing/)가 동시에 호출될 수 있는 경우(예: 지연 초기화 중) 해당 호출을 동기화하십시오. 라이선스 설정 메서드 자체는 스레드 안전하지 않기 때문입니다.

**`Presentation` 또는 `Slide` 객체를 스레드 간에 전달할 수 있나요?**

실행 중인 프레젠테이션 객체를 스레드 간에 전달하는 것은 권장되지 않습니다. 스레드마다 독립적인 인스턴스를 사용하거나 각 스레드용으로 별도의 프레젠테이션/슬라이드 컨테이너를 미리 생성하십시오. 이 접근 방식은 단일 프레젠테이션 인스턴스를 스레드 간에 공유하지 말라는 일반적인 권고와 일치합니다.

**각 스레드가 자체 `Presentation` 인스턴스를 가지고 있다면 다양한 형식(PDF, HTML, 이미지)으로의 내보내기를 병렬화해도 안전한가요?**

네. 독립적인 인스턴스와 별도의 출력 경로를 사용하면 이러한 작업은 일반적으로 올바르게 병렬화됩니다; 공유 프레젠테이션 객체와 공유 I/O 스트림은 피하십시오.

**멀티스레딩에서 전역 글꼴 설정(폴더, 대체 등)을 어떻게 해야 하나요?**

스레드를 시작하기 전에 모든 전역 글꼴 설정을 초기화하고, 병렬 작업 중에는 변경하지 마십시오. 이렇게 하면 공유 글꼴 리소스에 대한 경쟁 상태를 방지할 수 있습니다.
