我有一个递归目录复制功能,我想在后台运行。该函数带有两个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
)。