QtTaskTree::QCustomTask Class
template <typename Task, typename Adapter, typename Deleter> class QtTaskTree::QCustomTaskEine Klassenvorlage, die zum Deklarieren benutzerdefinierter Aufgabenelemente und zum Definieren ihrer „Setup“- und „Done“-Handler verwendet wird. Mehr...
| Header: | #include <qtasktree.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS TaskTree) target_link_libraries(mytarget PRIVATE Qt6::TaskTree) |
| qmake: | QT += tasktree |
| Seit: | Qt 6.11 |
| Erbt von: | QtTaskTree::ExecutableItem |
| Status: | Technologievorschau |
Diese Klasse befindet sich in der Technologievorschau und kann sich noch ändern.
Hinweis: Alle Funktionen 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 |
Ausführliche Beschreibung
Beschreibt benutzerdefinierte Aufgabenelemente innerhalb von Rezepten im Aufgabebaum.
Benutzerdefinierte Aufgabennamen werden mithilfe der Vorlage `QCustomTask` mit den angegebenen Parametern ` Task`, ` Adapter ` und ` Deleter` als Aliase mit eindeutigen Namen versehen. Beispielsweise ist ` QThreadFunctionTask<T>` ein Alias für die `QCustomTask`, die so definiert ist, dass sie mit ` QThreadFunction<T>` als zugehörige Aufgabenklasse zusammenarbeitet. Die folgende Tabelle enthält benutzerdefinierte Aufgaben, die von der TaskTree-Bibliothek bereitgestellt werden, sowie die zugehörigen Aufgabenklassen:
| Name der Aufgabe mit Alias | Zugehörige Aufgabenklasse | Kurzbeschreibung |
|---|---|---|
| QBarrierTask | QBarrier | Startet eine Awaiter-Aufgabe. |
| QThreadFunctionTask<ReturnType> | QThreadFunction<Rückgabetyp> | Startet eine asynchrone Aufgabe. Wird in einem separaten Thread ausgeführt. |
| QProcessTask | QProcess | Startet einen Prozess. |
| QNetworkReplyWrapperTask | QNetworkReplyWrapper | Sendet eine Netzwerkabfrage. |
| QTaskTreeTask | QTaskTree | Startet einen verschachtelten Aufgabenbaum. |
| QTcpSocketWrapperTask | QTcpSocketWrapper | Stellt eine TCP-Verbindung her. |
| QTimeoutTask | std::chrono::milliseconds | Startet einen Timer. |
Der Vorlagenparameter „ Task “ ist obligatorisch und legt fest, welche Art von „ Task “ die ausgeführte „ QTaskTree “ instanziieren soll, wenn sie Teil eines Rezepts ist. Der Typ „ Task “ muss standardmäßig konstruierbar sein.
Das Template-Argument „ Adapter “ ist optional. Es kann weggelassen werden, wenn „ QDefaultTaskAdapter<Task>“ für die Anpassung an den Typ „ Task “ geeignet ist. Andernfalls muss der Typ „ Adapter “ für bestimmte „ Task “ folgende Form haben:
class Adapter
{
public:
void operator()(Task *task, QTaskInterface *iface) { ... }
};Implementieren Sie den oben genannten Operator() zum Starten der „ task “ und rufen Sie die Methode „ QTaskInterface::reportDone()“ für die übergebene „ iface “ auf, sobald die Aufgabe abgeschlossen ist.
Es ist gewährleistet, dass die übergebenen Objekte ` Task ` und ` QTaskInterface ` länger bestehen als die ` Adapter`. Falls erforderlich, darf der Destruktor von ` Adapter ` weiterhin auf das übergebene ` Task` zugreifen.
Weitere Details finden Sie unter QTaskInterface.
Das Template-Argument „ Deleter “ ist optional. Standardmäßig wird „ std::default_delete<Task> “ verwendet. Der benutzerdefinierte „ Deleter “ ist nützlich, wenn der Destruktor der laufenden „ Task “ den aufrufenden Thread möglicherweise blockieren könnte. Anstatt zu blockieren, kann der benutzerdefinierte „Deleter“ die laufende Aufgabe in einen separaten Thread verschieben und dort die blockierende Zerstörung implementieren. Auf diese Weise lässt sich die (aus Sicht des aufrufenden Threads) schnelle Zerstörung der laufenden Aufgabe mit einem blockierenden Destruktor erreichen.
Siehe auch QTaskInterface.
Dokumentation zu Mitgliedstypen
[alias] QCustomTask::TaskDoneHandler
Typalias für „ std::function<QtTaskTree::DoneResult(const Task &, QtTaskTree::DoneWith)> “ oder „ DoneResult “.
Der `TaskDoneHandler` ist ein optionales Argument des Konstruktors eines benutzerdefinierten Task-Elements. Jede Funktion mit der oben genannten Signatur, die als Task-Done-Handler übergeben wird, wird vom laufenden Task-Baum aufgerufen, nachdem die Task-Ausführung abgeschlossen ist und bevor das Endergebnis der Ausführung an die übergeordnete Gruppe zurückgemeldet wird.
Im Hauptteil des Handlers können Sie die endgültigen Daten der abgeschlossenen Aufgabe abrufen. Die zusätzlichen Parameter, einschließlich der Speicher, können über die Lambda-Erfassung 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 kann in Ihrem „done“-Handler weggelassen werden. Wenn es angegeben wird, enthält es die Informationen über das Endergebnis einer Aufgabe, die an die übergeordnete Gruppe gemeldet werden.
Wenn Sie nicht vorhaben, Daten aus der abgeschlossenen Aufgabe auszulesen, 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 entspricht das Endergebnis der Aufgabe dem durch das Argument „ DoneResult “ angegebenen Wert. 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` vom Typ ` DoneResult ` wird keine zusätzliche Verarbeitung durchgeführt, und die Aufgabe wird bedingungslos mit dem übergebenen Wert von ` DoneResult` beendet.
Siehe auch „ QCustomTask()“, „ TaskSetupHandler “ und „ GroupDoneHandler “.
[alias] QCustomTask::TaskSetupHandler
Typalias für „ std::function<SetupResult(Task &)> “.
`TaskSetupHandler` ist ein optionales Argument des Konstruktors eines benutzerdefinierten Aufgabenelements. Jede Funktion mit der oben genannten Signatur, die als Aufgaben-Setup-Handler übergeben wird, wird vom laufenden Aufgabenbaum nach der Erstellung der Aufgabe und vor deren Start aufgerufen.
Im Hauptteil des Handlers können Sie die Aufgabe entsprechend Ihren Anforderungen konfigurieren. Die zusätzlichen Parameter, einschließlich Speicher, können über die Lambda-Erfassung an den Handler übergeben werden. Sie können dynamisch entscheiden, ob die Aufgabe gestartet oder bei Erfolg bzw. bei einem Fehler übersprungen werden soll.
Hinweis: Starten Sie die Aufgabe nicht selbst innerhalb des Start-Handlers. Überlassen Sie dies „ QTaskTree “, andernfalls ist das Verhalten undefiniert. „ QTaskTree “ weiß dank des an den Konstruktor von „ QCustomTask<Task, Adapter, Deleter>“ übergebenen Adapter-Template-Parameters bereits, wie die Aufgabe gestartet wird.
Der Rückgabewert des Handlers gibt dem laufenden Aufgabenbaum vor, wie nach Beendigung des Handler-Aufrufs weiter verfahren werden soll. Der Rückgabewert von ` SetupResult::Continue ` weist den Aufgabenbaum an, die Ausführung fortzusetzen, d. h. den zugehörigen ` Task` auszuführen. Der Rückgabewert von ` SetupResult::StopWithSuccess ` oder ` SetupResult::StopWithError ` weist den Aufgabenbaum an, die Ausführung der Aufgabe zu überspringen und sie sofort erfolgreich bzw. mit einem Fehler zu beenden.
Wenn der Rückgabetyp entweder „ SetupResult::StopWithSuccess “ oder „ SetupResult::StopWithError “ ist, wird der „done“-Handler der Aufgabe (sofern vorhanden) anschließend nicht aufgerufen.
Der Konstruktor einer benutzerdefinierten Aufgabe akzeptiert auch Funktionen in der verkürzten Form „ std::function<void(Task &)> “, d. h., der Rückgabewert lautet „ void “. In diesem Fall wird davon ausgegangen, dass der Rückgabewert „ SetupResult::Continue “ ist.
Siehe auch „ QCustomTask()“, „ TaskDoneHandler “ und „ GroupSetupHandler “.
Dokumentation zu 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)
Erstellt eine QCustomTask-Instanz und fügt der Aufgabe die Handler „ setup “ und „ done “ hinzu. Wenn der laufende Aufgabenbaum die Aufgabe starten will, instanziiert er das zugehörige „ Task “-Objekt, ruft den „ setup “-Handler mit einer Referenz auf die erstellte Aufgabe auf und startet diese. Wenn die laufende Aufgabe beendet ist, ruft der Aufgabenbaum den „ done “-Handler mit einer „ const “-Referenz auf die erstellte Aufgabe auf.
Der übergebene Handler „ setup “ ist vom Typ „ TaskSetupHandler “. 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 vom Standard abweichenden Wert für das Argument ` callDone `, wenn der Handler nur bei erfolgreicher, fehlgeschlagener oder abgebrochener Ausführung aufgerufen werden soll.
Siehe auch „ TaskSetupHandler “ und „ TaskDoneHandler “.
Verwandte Nicht-Mitglieder
[alias] QBarrierTask
Typalias für die Klasse „ QCustomTask “ <QBarrier> zur Verwendung in Rezepten.
[alias] QNetworkReplyWrapperTask
Typalias für die Klasse „ QCustomTask “ <QNetworkReplyWrapper>, zur Verwendung in Rezepten.
[alias] QProcessTask
Typalias für die „ QCustomTask “ <QProcess> unter Verwendung von QProcessTaskDeleter, zur Verwendung in Rezepten.
[alias] QTaskTreeTask
Typalias für die Klasse „ QCustomTask “ <QTaskTree>, zur Verwendung in Rezepten.
[alias] QTcpSocketWrapperTask
Typalias für die „ QCustomTask “ <QTcpSocketWrapper>, zur Verwendung in Rezepten.
[alias] template <typename ResultType> QThreadFunctionTask
Typalias für „ QCustomTask<QThreadFunction<ResultType>>“, wobei „ ResultType “ den Rückgabetyp der Thread-Funktion angibt, der innerhalb von Rezepten verwendet werden soll.
[alias] QTimeoutTask
Typalias für die „ QCustomTask “ <std::chrono::milliseconds>, zur Verwendung in Rezepten. Mit „ std::chrono::milliseconds “ wird die Zeitüberschreitungsdauer festgelegt. Die Standard-Zeitüberschreitung ist „ std::chrono::milliseconds::zero() “, d. h., die „QTimeoutTask“ wird beendet, sobald die Steuerung zur laufenden Ereignisschleife zurückkehrt.
Anwendungsbeispiel:
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.