QtTaskTree::QCustomTask Class
template <typename Task, typename Adapter = QtTaskTree::QDefaultTaskAdapter<Task>, typename Deleter = std::default_delete<Task>> class QtTaskTree::QCustomTaskEine Klassenvorlage, die für die Deklaration von benutzerdefinierten Aufgaben und die Definition ihrer Setup- und Done-Handler verwendet wird. Mehr...
| Kopfzeile: | #include <qtasktree.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS TaskTree)target_link_libraries(mytarget PRIVATE Qt6::TaskTree) |
| qmake: | QT += tasktree |
| Seit: | Qt 6.11 |
| Vererbt: | QtTaskTree::ExecutableItem |
Hinweis: Alle Funktionen in dieser Klasse sind reentrant.
Öffentliche Typen
Öffentliche Funktionen
| QCustomTask(SetupHandler &&setup = QCustomTask::TaskSetupHandler(), DoneHandler &&done = QCustomTask::TaskDoneHandler(), QtTaskTree::CallDone callDone = QtTaskTree::CallDoneFlag::Always) |
Verwandte Nicht-Mitglieder
| QBarrierTask | |
| QNetworkReplyWrapperTask | |
| QProcessTask | |
| QTaskTreeTask | |
| QTcpSocketWrapperTask | |
| QThreadFunctionTask | |
| QTimeoutTask |
Detaillierte Beschreibung
Beschreibt benutzerdefinierte Taskelemente innerhalb von Taskbaumrezepten.
Benutzerdefinierte Aufgabennamen werden mit eindeutigen Namen unter Verwendung der QCustomTask-Vorlage mit einer bestimmten Aufgabe, einem Adapter und einem Deleter aliasiert. QThreadFunctionTask <T> ist beispielsweise ein Alias für den QCustomTask, der für die Arbeit mit QThreadFunction<T> als zugehörige Aufgabenklasse definiert ist. Die folgende Tabelle enthält benutzerdefinierte Tasks, die von der TaskTree-Bibliothek bereitgestellt werden, und ihre zugehörigen Task-Klassen:
| Aliased Task Name | Zugehörige Aufgabenklasse | Kurzbeschreibung |
|---|---|---|
| QBarrierTask | QBarrier | Startet eine Waiter-Task. |
| QThreadFunctionTask<ReturnType> | QThreadFunction<Rückgabearten> | Startet eine asynchrone Aufgabe. Läuft in einem separaten Thread. |
| QProcessTask | QProcess | Startet einen Prozess. |
| QNetworkReplyWrapperTask | QNetworkReplyWrapper | Sendet eine Netzwerkabfrage. |
| QTaskTreeTask | QTaskTree | Startet einen verschachtelten Task-Baum. |
| QTcpSocketWrapperTask | QTcpSocketWrapper | Stellt eine TCP-Verbindung her. |
| QTimeoutTask | std::chrono::milliseconds | Startet einen Timer. |
Der Parameter Task template ist obligatorisch und gibt an, welche Art von Task das laufende QTaskTree instanziieren wird, wenn es Teil eines Rezepts ist. Der Task Typ muss standardmäßig konstruierbar sein.
Das Argument Adapter template ist optional. Es kann übersprungen werden, wenn QDefaultTaskAdapter<Task> den Task Typ anpassen kann. Ansonsten muss die Adapter für bestimmte Task die folgende Form haben:
class Adapter { public: void operator()(Task *task, QTaskInterface *iface) { ... } };
Implementieren Sie den obigen Operator(), um die task zu starten, und rufen Sie die Methode QTaskInterface::reportDone() für die übergebene iface auf, wenn die Aufgabe beendet ist.
Es ist garantiert, dass die übergebenen Task und QTaskInterface die Adapter überdauern. Falls nötig, kann der Destruktor von Adapter noch auf die übergebenen Task zugreifen.
Für weitere Einzelheiten siehe QTaskInterface.
Das Argument der Vorlage Deleter ist optional. Standardmäßig wird das std::default_delete<Task> verwendet. Das benutzerdefinierte Deleter ist nützlich, wenn der Destruktor des laufenden Task den Thread des Aufrufers möglicherweise blockiert. Anstatt zu blockieren, kann der benutzerdefinierte Deleter die laufende Aufgabe in einen separaten Thread verschieben und die blockierende Zerstörung dort implementieren. Auf diese Weise kann die schnelle Zerstörung (aus Sicht des aufrufenden Threads) der laufenden Aufgabe mit einem blockierenden Destruktor erreicht werden.
Siehe auch QTaskInterface.
Dokumentation der Mitgliedstypen
[alias] QCustomTask::TaskDoneHandler
Typ-Alias für std::function<QtTaskTree::DoneResult(const Task &, QtTaskTree::DoneWith)> oder DoneResult.
Der TaskDoneHandler ist ein optionales Argument des Konstruktors eines benutzerdefinierten Aufgabenelements. Jede Funktion mit der obigen Signatur wird, wenn sie als TaskDoneHandler übergeben wird, vom laufenden Aufgabenbaum aufgerufen, nachdem die Ausführung der Aufgabe beendet ist und bevor das Endergebnis der Ausführung an die übergeordnete Gruppe zurückgemeldet wird.
Innerhalb des Body des Handlers können Sie die endgültigen Daten der beendeten Aufgabe abrufen. Die zusätzlichen Parameter, einschließlich der Speicherplätze, können über das Lambda-Capture an den Handler übergeben werden. Es ist auch möglich, dynamisch zu entscheiden, ob die Aufgabe mit ihrem Rückgabewert beendet werden soll oder ob das Endergebnis angepasst werden soll.
Das Argument DoneWith ist optional, und Ihr done-Handler kann es weglassen. Wenn es angegeben wird, enthält es die Informationen über das Endergebnis einer Aufgabe, die an ihre Eltern gemeldet wird.
Wenn Sie nicht vorhaben, irgendwelche Daten aus der beendeten Aufgabe zu lesen, können Sie das Argument const Task & weglassen.
Der zurückgegebene Wert DoneResult ist optional und Ihr Handler kann stattdessen void zurückgeben. In diesem Fall ist das Endergebnis der Aufgabe gleich dem Wert, der durch das Argument DoneResult angegeben wird. Wenn der Handler den Wert DoneResult zurückgibt, kann das Endergebnis der Aufgabe innerhalb des Körpers des Done-Handlers durch den zurückgegebenen Wert angepasst werden.
Bei einem TaskDoneHandler des Typs DoneResult wird keine zusätzliche Behandlung durchgeführt, und die Aufgabe wird bedingungslos mit dem übergebenen Wert von DoneResult beendet.
Siehe auch QCustomTask(), TaskSetupHandler, und GroupDoneHandler.
[alias] QCustomTask::TaskSetupHandler
Typ-Alias für std::function<SetupResult(Task &)>.
TaskSetupHandler ist ein optionales Argument des Konstruktors eines benutzerdefinierten Aufgabenelements. Jede Funktion mit der obigen Signatur wird, wenn sie als Task-Setup-Handler übergeben wird, vom laufenden Task-Baum aufgerufen, nachdem die Aufgabe erstellt und bevor sie gestartet wurde.
Im Körper des Handlers können Sie die Aufgabe nach Ihren Bedürfnissen konfigurieren. Die zusätzlichen Parameter, einschließlich der Speicherplätze, können über das Lambda-Capture an den Handler übergeben werden. Sie können dynamisch entscheiden, ob die Aufgabe bei Erfolg oder im Fehlerfall gestartet oder übersprungen werden soll.
Hinweis: Starten Sie die Aufgabe nicht selbst innerhalb des Start-Handlers. Überlassen Sie dies QTaskTree, sonst ist das Verhalten undefiniert. QTaskTree weiß bereits, wie die Aufgabe zu starten ist, dank des Adapter-Template-Parameters, der an den QCustomTask<Task, Adapter, Deleter> Konstruktor übergeben wird.
Der Rückgabewert des Handlers weist den laufenden Task-Baum an, wie er nach dem Aufruf des Handlers fortfahren soll. Der Rückgabewert von SetupResult::Continue weist den Task-Baum an, weiterzulaufen, d.h. den zugehörigen Task auszuführen. Der Rückgabewert SetupResult::StopWithSuccess oder SetupResult::StopWithError weist den Aufgabenbaum an, die Ausführung der Aufgabe zu überspringen und sie sofort mit Erfolg bzw. einem Fehler zu beenden.
Wenn der Rückgabetyp entweder SetupResult::StopWithSuccess oder SetupResult::StopWithError ist, wird der done-Handler der Aufgabe (falls vorhanden) anschließend nicht aufgerufen.
Der Konstruktor einer benutzerdefinierten Aufgabe akzeptiert auch Funktionen in der verkürzten Form von std::function<void(Task &)>, d. h. der Rückgabewert ist void. In diesem Fall wird angenommen, dass der Rückgabewert SetupResult::Continue ist.
Siehe auch QCustomTask(), TaskDoneHandler, und GroupSetupHandler.
Dokumentation der Mitgliedsfunktionen
[explicit] template <
typename SetupHandler = QtTaskTree::QCustomTask<Task, Adapter, Deleter>::TaskSetupHandler,
typename DoneHandler = QtTaskTree::QCustomTask<Task, Adapter, Deleter>::TaskDoneHandler,
std::enable_if_t<!std::is_same_v<q20::remove_cvref_t<SetupHandler>, QCustomTask<Task, Adapter, Deleter>>, bool> = true
>
QCustomTask::QCustomTask(SetupHandler &&setup = QCustomTask::TaskSetupHandler(), DoneHandler &&done = QCustomTask::TaskDoneHandler(), QtTaskTree::CallDone callDone = QtTaskTree::CallDoneFlag::Always)
Konstruiert eine QCustomTask-Instanz und fügt die Handler setup und done an die Aufgabe an. Wenn der laufende Aufgabenbaum die Aufgabe starten will, instanziiert er das zugehörige Task Objekt, ruft den setup Handler mit einem Verweis auf die erstellte Aufgabe auf und startet sie. Wenn die laufende Aufgabe beendet ist, ruft der Aufgabenbaum einen done Handler mit einem const Verweis auf die erstellte Aufgabe auf.
Der übergebene setup Handler ist vom Typ TaskSetupHandler. Ein Beispiel:
static void parseAndLog(const QString &input); ... const QString input = ...; const auto onFirstSetup = [input](QThreadFunction<void> &task) { if (input == "Skip") return SetupResult::StopWithSuccess; // This task won't start, the next one will if (input == "Error") return SetupResult::StopWithError; // This task and the next one won't start task.setThreadFunctionData(parseAndLog, input); // This task will start, and the next one will start after this one finished with success return SetupResult::Continue; }; const auto onSecondSetup = [input](QThreadFunction<void> &task) { task.setThreadFunctionData(parseAndLog, input); }; const Group group { QThreadFunctionTask<void>(onFirstSetup), QThreadFunctionTask<void>(onSecondSetup) };
Der done Handler ist vom Typ TaskDoneHandler. Standardmäßig wird der done Handler immer dann aufgerufen, wenn die Aufgabe beendet ist. Übergeben Sie einen anderen Wert als den Standardwert für das Argument callDone, wenn Sie möchten, dass der Handler nur bei einer erfolgreichen, fehlgeschlagenen oder abgebrochenen Ausführung aufgerufen wird.
Siehe auch TaskSetupHandler und TaskDoneHandler.
Verwandte Nicht-Mitglieder
[alias] QBarrierTask
Typ-Alias für die QCustomTask<QBarrier>, der in Rezepten verwendet werden kann.
[alias] QNetworkReplyWrapperTask
Typ-Alias für die QCustomTask<QNetworkReplyWrapper>, der in Rezepten verwendet werden kann.
[alias] QProcessTask
Geben Sie einen Alias für QCustomTask<QProcess> unter Verwendung von QProcessTaskDeleter ein, der in Rezepten verwendet werden kann.
[alias] QTaskTreeTask
Typ-Alias für die QCustomTask<QTaskTree>, der in Rezepten verwendet werden kann.
[alias] QTcpSocketWrapperTask
Typ-Alias für die QCustomTask<QTcpSocketWrapper>, der in Rezepten verwendet werden kann.
[alias] template <typename ResultType> QThreadFunctionTask
Typ-Alias für die QCustomTask<QThreadFunction<ResultType>>, die innerhalb von Rezepten verwendet werden kann.
[alias] QTimeoutTask
Geben Sie einen Alias für QCustomTask<std::chrono::milliseconds> ein, der in Rezepten verwendet werden soll. Die std::chrono::milliseconds wird verwendet, um die Timeout-Dauer festzulegen. Der Standard-Timeout ist std::chrono::milliseconds::zero(), d.h. der QTimeoutTask wird beendet, sobald die Steuerung zur laufenden Ereignisschleife zurückkehrt.
Beispiel für die Verwendung:
using namespace std::chrono; using namespace std::chrono_literals; const auto onSetup = [](milliseconds &timeout) { timeout = 1000ms; } const auto onDone = [] { qDebug() << "Timed out."; } const Group root { QTimeoutTask(onSetup, onDone) };
Siehe auch timeoutTask().
© 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.