在本页

QtTaskTree::QThreadFunction Class

template <typename ResultType> class QtTaskTree::QThreadFunction

通过 QtConcurrent::run() 在独立线程中控制函数执行的类模板。更多

Header: #include <qthreadfunctiontask.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS TaskTree)
target_link_libraries(mytarget PRIVATE Qt6::TaskTree)
qmake: QT += tasktree
Qt 6.11
继承: QtTaskTree::QThreadFunctionBase

注意:该类中的所有函数都是可重入的

公共函数

QThreadFunction(QObject *parent = nullptr)
virtual ~QThreadFunction() override
QFuture<ResultType> future() const
QFutureWatcher<ResultType> *futureWatcher()
const QFutureWatcher<ResultType> *futureWatcher() const
bool isAutoDelayedSync() const
bool isDone() const
bool isResultAvailable() const
ResultType result() const
ResultType resultAt(int index) const
QList<ResultType> results() const
void setAutoDelayedSync(bool on)
void setThreadFunctionData(Function &&function, Args &&... args)
void setThreadPool(QThreadPool *pool)
ResultType takeResult() const
QThreadPool *threadPool() const

详细说明

QThreadFunction 是一个方便的类模板,它将存储的函数(稍后通过 QtConcurrent::run() 调用)与监控函数执行的内部QFutureWatcher 结合在一起。使用QThreadFunctionTaskQTaskTree 配方中执行 QThreadFunction。

使用setThreadFunctionData() 方法将函数及其参数设置为在单独的线程中执行。

要从在独立线程中运行的函数内部报错,请将该函数中的QPromise<ResultType> &promise 参数作为第一个参数,并取消承诺的未来。示例

static void copyFile(QPromise<void> &promise, const QString &source,
                     const QString &destination)
{
    const QFileInfo fi(source);
    if (!fi.exists()) {
        promise.future().cancel(); // The QThreadFunction finishes with DoneResult::Error
        return;
    }

    // Copy file...
}

QThreadFunction<void> task;
task.setThreadFunctionData(copyFile, "source.txt", "dest.txt");
task.start();

使用setThreadPool() 在所需的QThreadPool 中执行函数,否则函数将使用global thread pool

使用setAutoDelayedSync() 可切换自动延迟同步。

要控制函数的执行,请连接相关futureWatcher() 的信号。要收集输出数据,请使用result(),resultAt() 或results() 获取器。

成员函数文档

[default] QThreadFunction::QThreadFunction(QObject *parent = nullptr)

用给定的parent 构建一个 QThreadFunction。

[override virtual] QThreadFunction::~QThreadFunction()

销毁QThreadFunction 。如果QThreadFunction 没有运行,则不执行其他操作,否则取消相关的未来,并根据自动延迟同步的情况执行以下操作:

自动延迟同步操作
开启相关的QFuture 保存在全局注册表中。在应用程序退出时使用QThreadFunctionBase::syncAll() 同步之前存储在全局注册表中的所有期货。
直接执行对QFuture::waitForFinished() 的阻塞调用。

当自动延迟同步开启时,未来程序的取消可能会在另一个线程中仍在运行的函数内部被拦截,这样它就可以尽快完成任务,而不需要完成自己的工作。

最后,在应用程序退出时,应调用QThreadFunctionBase::syncAll() 以同步所有仍可能在单独线程中运行的函数。对QThreadFunctionBase::syncAll() 的调用是阻塞的,以防某些函数仍在最终完成。

注意: 当自动延迟同步开启时,函数仍会在QThreadFunction 的析构函数结束后运行一段时间,因此用户有责任确保函数可能操作的所有数据仍然可用。如果无法保证这一点,可通过QThreadFunction::setAutoDelayedSync (false)将自动延迟同步设置为关闭。在这种情况下,QThreadFunction 析构函数将阻塞等待函数完成后再删除QThreadFunction 。有关Deleter 模板参数的更多信息,请参阅QCustomTask 文档。

另请参阅 setAutoDelayedSync() 和syncAll()。

QFuture<ResultType> QThreadFunction::future() const

返回QFuture<ResultType> 与在单独线程中执行的函数相关联。

QFutureWatcher<ResultType> *QThreadFunction::futureWatcher()

返回与在单独线程中执行的函数相关联的QFutureWatcher<ResultType> 指针。返回的观察者的生命周期与QThreadFunction 实例绑定。

如果需要对未来的执行进行更多控制,例如连接到返回的观察者的进度信号,请使用此函数。

const QFutureWatcher<ResultType> *QThreadFunction::futureWatcher() const

返回与单独线程中执行的函数相关的const 指针QFutureWatcher<ResultType>

这是一个重载函数。

bool QThreadFunction::isAutoDelayedSync() const

返回自动延迟同步是否开启。

另请参阅 syncAll() 和setAutoDelayedSync()。

bool QThreadFunction::isDone() const

返回函数是否执行完毕。

bool QThreadFunction::isResultAvailable() const

返回结果是否就绪。

另请参阅 result().

ResultType QThreadFunction::result() const

返回在独立线程中执行的函数所报告的 ResultType。

注意: 通过调用isResultAvailable() 确保结果已准备就绪,否则,如果尚未报告结果,对 result() 的调用可能会阻塞,如果函数执行完毕但未报告任何结果,甚至会崩溃。

另请参阅 QFutureWatcher::result()。

ResultType QThreadFunction::resultAt(int index) const

返回在index 单独线程中执行的函数所报告的 ResultType。

另请参阅 result() 和QFutureWatcher::resultAt() 。

QList<ResultType> QThreadFunction::results() const

返回在单独线程中执行的函数所报告的 ResultType 列表。

另请参阅 result(),resultAt() 和QFuture::results().

void QThreadFunction::setAutoDelayedSync(bool on)

将自动延迟同步设置为on

默认情况下,自动延迟同步是开启的,这意味着运行中的QThreadFunction 对象的销毁不会阻塞等待,直到在单独线程中运行的函数完成。相反,相关的QFuture 会被取消,函数会继续运行直到结束。在独立线程中运行的函数可以通过QPromise 参数拦截取消,这样它就可以提前结束,而不会完成自己的工作。如果开启了自动延迟同步,就必须在应用程序退出时调用QThreadFunctionBase::syncAll() ,以便同步所有可能在独立线程中运行的函数。

关闭自动延迟同步时,同步会在QThreadFunction 销毁时进行,这会阻塞调用线程相当长的时间。

只有在主线程执行QThreadFunction 时,才会使用自动同步。

另请参见 syncAll() 和isAutoDelayedSync()。

template <typename Function, typename... Args> void QThreadFunction::setThreadFunctionData(Function &&function, Args &&... args)

设置当调用 start() 时,在单独线程中通过args 执行的function

另请参阅 QtConcurrent::run()

void QThreadFunction::setThreadPool(QThreadPool *pool)

设置执行调用时使用的QThreadPool pool 。如果传递的poolnullptr ,则使用QThreadPool::globalInstance()。

另请参阅 threadPool()。

ResultType QThreadFunction::takeResult() const

获取(移动)在单独线程中执行的函数所报告的 ResultType。

注意: 通过调用isResultAvailable() 确保结果已准备就绪,否则,如果尚未报告结果,调用 takeResult() 可能会阻塞,如果函数执行完毕但未报告任何结果,甚至会崩溃。

另请参阅 QFuture::takeResult()。

QThreadPool *QThreadFunction::threadPool() const

返回执行调用时使用的线程池。如果返回nullptr ,则使用QThreadPool::globalInstance()。

另请参阅 setThreadPool()。

© 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.