이 페이지에서

QtTaskTree::Storage Class

template <typename StorageStruct> class QtTaskTree::Storage

실행 중인 작업 트리에서 사용자 정의 데이터 교환을 위한 클래스 템플릿입니다. 더 보기...

헤더: #include <qtasktree.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS TaskTree)
target_link_libraries(mytarget PRIVATE Qt6::TaskTree)
qmake: QT += tasktree
다음부터: Qt 6.11
상속받음: QtTaskTree::StorageBase
상태: 기술 미리보기

이 클래스는 기술 미리보기 단계에 있으며 변경될 수 있습니다.

참고: 이 클래스의 모든 함수는 재진입 가능합니다.

공개 함수

Storage()
Storage(const FirstArg &firstArg, const Args &... args)
StorageStruct *activeStorage() const
StorageStruct &operator*() const
StorageStruct *operator->() const

상세 설명

Storage 클래스 템플릿은 사용자 정의 StorageStruct 유형의 개체를 동적으로 생성하고 소멸시키는 역할을 합니다. 생성 및 소멸은 실행 중인 작업 트리에서 관리합니다. Storage 개체가 Group 요소 내에 배치된 경우, 실행 중인 작업 트리는 그룹이 시작될 때 및 그룹의 설정 핸들러가 호출되기 전에 StorageStruct 개체를 생성합니다. 이후, 이 그룹 내의 어떤 핸들러가 호출될 때마다 태스크 트리는 이전에 생성된 StorageStruct 객체의 인스턴스를 활성화합니다. 여기에는 Storage 객체가 배치된 그룹 내의 모든 태스크 및 그룹의 설정(setup) 및 완료(done) 핸들러는 물론, 중첩된 그룹 내의 핸들러도 포함됩니다. Storage 객체의 복사본이 람다 캡처를 통해 핸들러로 전달되면, 핸들러는 Storage::operator->(), Storage::operator*() 또는 activeStorage() 메서드를 통해 실행 중인 태스크 트리가 활성화한 인스턴스에 접근할 수 있습니다. 두 핸들러가 동일한 Storage 객체를 캡처하는 경우, 한 핸들러는 해당 객체에 사용자 정의 데이터를 저장하고 다른 핸들러는 나중에 이를 읽을 수 있습니다. 그룹이 완료되면, 그룹의 done 핸들러가 호출된 후 이전에 생성된 StorageStruct 객체의 인스턴스가 소멸됩니다.

작업 간 데이터 교환의 예:

const Storage<QString> storage;

const auto onFirstDone = [storage](const FirstWorker &task) {
    // Assings QString, taken from the first task result, to the active QString instance
    // of the Storage object.
    *storage = task.getResultAsString();
};

const auto onSecondSetup = [storage](SecondWorker &task) {
    // Reads QString from the active QString instance of the Storage object and use it to
    // configure the second task before start.
    task.configureWithString(*storage);
};

const Group root {
    // The running task tree creates QString instance when root in entered
    storage,
    // The done handler of the first task stores the QString in the storage
    FirstWorkerTask(..., onFirstDone),
    // The setup handler of the second task reads the QString from the storage
    SecondWorkerTask(onSecondSetup, ...)
};

루트 그룹은 태스크를 순차적으로 실행하므로, ` onFirstDone ` 핸들러는 항상 ` onSecondSetup ` 핸들러보다 먼저 호출됩니다. 즉, ` onSecondSetup ` 핸들러 본문 내의 ` storage `에서 읽은 ` QString ` 데이터는 이미 ` onFirstDone ` 핸들러에 의해 설정된 상태입니다. ` sequential ` 실행 모드에서는 이를 항상 신뢰할 수 있습니다.

Storage의 내부 구조는 모든 복사본 간에 공유됩니다. 그렇기 때문에 핸들러의 람다 캡처 내부에 있는 Storage 객체의 복사본들은 여전히 동일한 Storage 인스턴스를 참조합니다. 동일한 Storage 객체의 복사본을 포함하지 않는 한, 하나의 Group 요소 내에 여러 개의 Storage 객체를 배치할 수 있습니다. 그렇지 않은 경우, 런타임에 오류 메시지가 포함된 어서트(assert)가 트리거됩니다. 그러나 동일한 레시피 내의 서로 다른 ` Group ` 요소에 동일한 `Storage` 객체의 복사본을 배치할 수는 있습니다. 이 경우, 실행 중인 작업 트리는 ` StorageStruct ` 객체의 여러 인스턴스(복사본마다 하나씩)를 생성하며, 스토리지 섀도잉이 발생합니다. 스토리지 섀도잉은 중첩된 코드 블록 내의 C++ 변수 섀도잉과 유사한 방식으로 작동합니다:

Storage<QString> storage;

const Group root {
    storage,                            // Top copy, 1st instance of StorageStruct
    onGroupSetup([storage] { ... }),    // Top copy is active
    Group {
        storage,                        // Nested copy, 2nd instance of StorageStruct,
                                        // shadows Top copy
        onGroupSetup([storage] { ... }) // Nested copy is active
    },
    Group {
        onGroupSetup([storage] { ... }) // Top copy is active
    }
};

Storage 객체는 실행 중인 작업 트리에 초기 데이터를 전달하거나, 작업 트리가 완료되기 전에 최종 데이터를 읽어내는 데에도 사용할 수 있습니다. 이를 위해서는 각각 onStorageSetup() 또는 onStorageDone()을 사용하십시오.

참고: 레시피에 스토리지 객체를 추가하는 것을 잊었거나, 추가했더라도 핸들러의 조상 그룹에 포함시키지 않아 핸들러 내부에서 접근할 수 없는 스토리지 객체를 사용하는경우 , 다음 메시지가 표시된 후 프로그램이 충돌할 수 있습니다: " 참조된 스토리지에 실행 중인 트리에서 접근할 수 없습니다." nullptr이 반환되어 호출 코드에서 크래시가 발생할 수 있습니다. 트리에 스토리지 항목이 추가되지 않았거나, 참조된 위치에서 스토리지 항목에 접근할 수 없는 경우일 수 있습니다.

멤버 함수 문서

Storage::Storage()

지정된 ` StorageStruct ` 유형에 대한 저장소를 생성합니다. 실행 중인 ` QTaskTree `이 해당 저장소가 배치된 ` Group `에 진입할 때마다, 기본 생성자를 사용하여 ` StorageStruct `를 생성합니다.

참고: this 객체의모든 인스턴스는 동일한 Storage 인스턴스로 간주됩니다.

[explicit] template < typename FirstArg, typename... Args, std::enable_if_t<!std::is_same_v<q20::remove_cvref_t<FirstArg>, Storage<StorageStruct>>, bool> = true > Storage::Storage(const FirstArg &firstArg, const Args &... args)

지정된 ` StorageStruct ` 유형에 대한 스토리지 인스턴스를 생성합니다. 전달된 ` firstArg ` 및 ` args `는 스토리지 생성 시 저장되며, 이후 실행 중인 ` QTaskTree `에서 저장된 ` args`을 사용하여 ` StorageStruct `를 구성하는 데 사용됩니다.

참고: this 객체의모든 복사본은 동일한 Storage 인스턴스로 간주됩니다.

StorageStruct *Storage::activeStorage() const

실행 중인 작업 트리에서 생성된 활성 ‘ StorageStruct ’ 객체에 대한 포인터를 반환합니다. 이 함수는 레시피 내에 배치된 ‘ GroupItem ’ 요소의 핸들러 본문 내에서만 사용해야 하며, 그렇지 않을 경우 프로그램이 중단될 수 있습니다. ‘Storage’가 핸들러 그룹 항목의 상위 그룹 중 어느 곳에든 배치되어 있는지 확인하십시오.

참고: 반환된포인터는 이 인스턴스를 생성한 그룹이 여전히 실행 중인 동안에만 유효합니다.

operator->() 및 operator*()도 참조하십시오 .

[noexcept] StorageStruct &Storage::operator*() const

실행 중인 작업 트리에서 생성된 활성 ‘ StorageStruct ’ 객체에 대한 참조를 반환합니다. 이 함수는 레시피 내에 배치된 ‘ GroupItem ’ 요소의 핸들러 본문 내에서만 사용해야 하며, 그렇지 않을 경우 프로그램이 중단될 수 있습니다. ‘Storage’가 핸들러 그룹 항목의 상위 그룹 중 하나에 배치되어 있는지 확인하십시오.

참고: 반환된참조는 이 인스턴스를 생성한 그룹이 여전히 실행 중인 동안에만 유효합니다.

activeStorage() 및 operator->()도 참조하십시오 .

[noexcept] StorageStruct *Storage::operator->() const

실행 중인 작업 트리에서 생성된 활성 ` StorageStruct ` 객체에 대한 포인터를 반환합니다. 이 함수는 레시피 내에 배치된 ` GroupItem ` 요소의 핸들러 본문 내에서만 사용해야 하며, 그렇지 않을 경우 프로그램이 중단될 수 있습니다. `Storage`가 핸들러 그룹 항목의 상위 그룹 중 하나에 배치되어 있는지 확인하십시오.

참고: 반환된포인터는 이 인스턴스를 생성한 그룹이 여전히 실행 중인 동안에만 유효합니다.

activeStorage() 및 operator*()도 참조하십시오 .

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.