我有一个递归目录复制功能,我想在后台运行。该函数带有两个QString参数,文件路径和目录。

从.pro:

QT += core gui sql network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
LIBS += -lQt5Concurrent

来自代码:
#include <QtConcurrent/QtConcurrent>
#include <qtconcurrentrun.h>
#include <QThread>
...

QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir));

我收到以下编译错误:
 error: no matching function for call to 'run'
 QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir) );
                  ^~~~~~~~~~~~~~~~~

如果我这样调用函数:
QFuture <void> future = QtConcurrent::run(copyFolder, filepath,dir );

error: reference to non-static member function must be called
QFuture <void> future = QtConcurrent::run(copyFolder, filepath,dir );
                            ^~~~~~~~~~

我究竟做错了什么?

最佳答案



您不应该以自己的方式传递参数。相反,您应该将函数的参数作为参数传递给QtConcurrent::run,请参阅docs here

您的通话应如下所示:

QFuture <void> future = QtConcurrent::run(copyFolder, filepath, dir);

这样QtConcurrent将复制您传递的参数,并从默认QThreadPool在线程中执行函数调用。



如果必须在类中调用非静态成员函数,则必须传递要在其上运行该函数的对象,请参阅docs here。假设您正在使用类中另一个成员函数的QtConcurrent::run(因为否则会出现其他错误),您应该执行以下操作:
QFuture <void> future = QtConcurrent::run(this, &ClassName::copyFolder, filepath, dir);

注意,您必须确保所有对共享数据的访问(在两个线程之间)都应该序列化(也许使用QMutex)。

10-07 17:20