이 페이지에서

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::operator->(), Storage::operator*() 또는 activeStorage() 메서드를 통해 실행 중인 작업 트리에 의해 활성화된 인스턴스에 액세스할 수 있습니다. 두 개의 핸들러가 동일한 저장소 개체를 캡처하는 경우, 그 중 하나는 사용자 정의 데이터를 저장하고 다른 하나는 나중에 읽을 수 있습니다. 그룹이 완료되면 그룹이 완료된 핸들러가 호출된 후 이전에 생성된 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 객체의 복사본이 포함되지 않는다면 하나의 Group 요소 안에 여러 개의 Storage 객체를 배치할 수 있습니다. 그렇지 않으면 런타임에 오류 메시지가 포함된 어서트가 트리거됩니다. 그러나 동일한 스토리지 개체의 복사본을 동일한 레시피의 다른 Group 요소에 배치할 수 있습니다. 이 경우 실행 중인 작업 트리가 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
    }
};

스토리지 객체는 실행된 작업 트리에 초기 데이터를 전달하고 작업 트리가 완료되기 전에 최종 데이터를 읽는 데에도 사용할 수 있습니다. 이렇게 하려면 각각 onStorageSetup() 또는 onStorageDone()를 사용합니다.

참고: 레시피에 저장소를 배치하는 것을 잊었거나 처리기의 조상 그룹에 저장소를 배치하지 않아 처리기 내부에서 연결할 수 없는 저장소 개체를 사용하는 경우 다음 메시지와 함께 크래시가 발생할 수 있습니다: 실행 중인 트리에서 참조된 저장소에 도달할 수 없습니다. 호출 코드에서 충돌이 발생할 수 있는 nullptr이 반환됩니다. 트리에 저장소가 추가되지 않았거나 참조된 위치에서 저장소에 도달할 수 없는 경우일 수 있습니다.

멤버 함수 문서

Storage::Storage()

주어진 StorageStruct 유형에 대한 스토리지를 만듭니다. 실행 중인 QTaskTree 이 저장소가 있는 Group 에 들어갈 때마다 기본 생성자를 사용하여 StorageStruct 을 생성합니다.

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

[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 타입의 스토리지를 생성합니다. 전달된 firstArgargs 은 저장소를 생성할 때 저장되며, 나중에 실행 중인 QTaskTree 에서 저장된 args 으로 StorageStruct 을 구성하는 데 사용됩니다.

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

StorageStruct *Storage::activeStorage() const

실행 중인 작업 트리에 의해 생성된 활성 StorageStruct 개체에 대한 포인터를 반환합니다. 이 함수는 레시피에 배치된 GroupItem 요소의 핸들러 본문 내부에서만 사용하세요. 그렇지 않으면 충돌이 발생할 수 있습니다. 저장소가 핸들러의 그룹 항목의 그룹 조상에 배치되어 있는지 확인하세요.

참고: 반환된 포인터는 이 인스턴스를 생성한 그룹이 계속 실행 중인 한 유효합니다.

operator->() 및 operator*()도 참조하세요 .

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

실행 중인 작업 트리에 의해 생성된 활성 StorageStruct 개체에 대한 참조를 반환합니다. 이 함수는 레시피에 배치된 GroupItem 요소의 핸들러 본문 내부에서만 사용하세요. 그렇지 않으면 충돌이 발생할 수 있습니다. 저장소가 핸들러의 그룹 항목의 그룹 조상에 배치되어 있는지 확인하세요.

참고: 반환된 참조는 이 인스턴스를 만든 그룹이 계속 실행 중인 한 유효합니다.

activeStorage() 및 operator->()도 참조하세요 .

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

실행 중인 작업 트리에 의해 생성된 활성 StorageStruct 개체에 대한 포인터를 반환합니다. 이 함수는 레시피에 배치된 GroupItem 요소의 핸들러 본문 내부에서만 사용하세요. 그렇지 않으면 충돌이 발생할 수 있습니다. 저장소가 핸들러의 그룹 항목의 그룹 조상에 배치되어 있는지 확인하세요.

참고: 반환된 포인터는 이 인스턴스를 생성한 그룹이 계속 실행 중인 한 유효합니다.

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.