Na ovoj stranici

Tasking::Storage Class

template <typename StorageStruct> class Tasking::Storage

Predložak klase za prilagođenu razmjenu podataka u aktivnom stablu zadataka. Više...

Header: #include <solutions/tasking/tasktree.h>
Inherits: Tasking::StorageBase

Napomena: Sve funkcije u ovoj klasi su reentrantne.

Javne funkcije

Storage()
StorageStruct *activeStorage() const
StorageStruct &operator*() const
StorageStruct *operator->() const

Detaljan opis

Predložak klase Storage odgovoran je za dinamičko stvaranje i uništavanje objekata prilagođenog tipa StorageStruct. Stvaranje i uništavanje upravlja se pomoću stabla aktivnih zadataka. Ako se objekt Storage postavi unutar elementa Group, stablo aktivnih zadataka stvara objekt StorageStruct kada se grupa pokrene i prije poziva upravljača za postavljanje grupe. Kasnije, kad god se pozove bilo koji handler unutar ove grupe, stablo zadataka aktivira prethodno stvorenu instancu objekta StorageStruct. To uključuje sve handlere za postavljanje (setup) i završetak (done) zadataka i grupa unutar grupe u koju je smješten objekt Storage, pa i unutar ugniježđenih grupa. Kada se kopija objekta Storage proslijedi handleru putem lambda zapisa, handler može pristupiti instanci koju je aktiviralo aktivno stablo zadataka pomoću metode operator->(), operator*() ili activeStorage(). Ako dva handlera zabilježe isti objekt Storage, jedan od njih može pohraniti prilagođene podatke, a drugi ih može pročitati nakon toga. Kada se grupa završi, prethodno stvorena instanca objekta StorageStruct uništava se nakon što se pozove handler za završetak grupe.

Primjer razmjene podataka između zadataka:

const Storage<QString> storage;

const auto onFirstDone = [storage](const Task &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](Task &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
    TaskItem(..., onFirstDone),
    // The setup handler of the second task reads the QString from the storage
    TaskItem(onSecondSetup, ...)
};

Budući da korijenska grupa izvršava svoje zadatke sekvencijalno, handler onFirstDone uvijek se poziva prije handlera onSecondSetup. To znači da su podaci QString, pročitani iz storage unutar tijela handlera onSecondSetup, već postavljeni od strane handlera onFirstDone. Uvijek se možete osloniti na to u načinu izvršavanja sequential.

Unutrašnjost spremišta dijeli se među svim njegovim kopijama. Zato se kopije objekta spremišta unutar lambda-uhvata rukovatelja i dalje odnose na istu instancu spremišta. Možete smjestiti više objekata spremišta unutar jednog elementa Group, pod uvjetom da ne uključuju kopije istog objekta spremišta. U suprotnom se tijekom izvođenja pokreće assert koji uključuje poruku o pogrešci. Međutim, kopije istog objekta spremišta možete smjestiti u različite elemente Group istog recepta. U tom slučaju, tijekom izvođenja stabla zadataka stvorit će se više instanci objekata StorageStruct (po jedna za svaku kopiju) i doći će do zasjenjivanja pohrane. Zasjenjivanje pohrane radi na sličan način kao zasjenjivanje varijabli u C++-u unutar ugniježđenih blokova koda:

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
    }
};

Objekti Storage također se mogu koristiti za prosljeđivanje početnih podataka izvršnom stablu zadataka i za čitanje konačnih podataka iz stabla zadataka prije njegovog završetka. Za to koristite onStorageSetup() odnosno onStorageDone()

Napomena: Ako u rukovatelju koristite ne dostupan objekt pohrane, jer ste zaboravili smjestiti pohranu u recept, ili ste je smjestili, ali ne u neku od skupina predaka rukovatelja, možete očekivati pad, prethodan sljedećoj poruci: Pozvana pohrana nije dostupna u aktivnom stablu. Vratit će se nullptr što može dovesti do pada pozivajućeg koda. Moguće je da nijedno spremište nije dodano u stablo ili da spremište nije dostupno s mjesta gdje se na njega referira.

Dokumentacija funkcija člana

Storage::Storage()

StorageStruct Stvara spremište za zadani tip objekta.

Napomena: Sve kopije objekta this smatraju se istom instancom spremišta.

StorageStruct *Storage::activeStorage() const

Vraća pokazivač na aktivni objekt StorageStruct a, stvoren od strane aktivnog stabla zadataka. Koristite ovu funkciju samo unutar tijela rukovatelja bilo kojeg elementa GroupItem a postavljenog u recept, inače možete očekivati pad. Pobrinite se da je Storage postavljen u bilo kojem pretku grupe stavke grupe rukovatelja.

Napomena: Vraćenipokazivač vrijedi sve dok grupa koja je stvorila ovu instancu još uvijek radi.

Vidi također operator->() i operator*().

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

Vraća referencu na aktivni objekt StorageStruct a, stvoren od strane aktivnog stabla zadataka. Koristite ovu funkciju samo unutar tijela rukovatelja bilo kojeg elementa GroupItem a postavljenog u recept, inače možete očekivati pad. Pobrinite se da je Storage postavljen u bilo kojem pretku grupe stavke grupe rukovatelja.

Napomena: Vraćenareferenca je valjana sve dok grupa koja je stvorila ovaj primjerak još uvijek radi.

Vidi također activeStorage() i operator->().

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

Vraća pokazivač na aktivni objekt StorageStruct a, stvoren od strane aktivnog stabla zadataka. Koristite ovu funkciju samo unutar tijela rukovatelja bilo kojeg elementa GroupItem a postavljenog u recept, inače možete očekivati pad. Pobrinite se da je Storage postavljen u bilo kojem pretku grupe stavke grupe rukovatelja.

Napomena: Vraćenipokazivač vrijedi sve dok grupa koja je stvorila ovu instancu još uvijek radi.

Vidi također activeStorage() i operator*().

Copyright © The Qt Company Ltd. and other contributors. 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.