2016-10-06 14 views
1

У меня есть функция копирования рекурсивного каталога, которую я хотел бы запустить в фоновом режиме. Функция принимает два аргумента QString, путь к файлу и каталог.QTConcurrent не компилирует

От .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); 
          ^~~~~~~~~~ 

Что я делаю неправильно?

+1

Есть ли другие строки ниже ошибки? Например. «примечание: кандидаты:« и так далее? –

+0

Да. Довольно много. – jocala

+0

После редактирования вы, кажется, пытаетесь вызвать другую функцию-член, используя 'QtConcurrent :: run', см. Мой ответ. – Mike

ответ

3

I get the following compile error:

error: no matching function for call to 'run' 
QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir)); 
        ^~~~~~~~~~~~~~~~~ 

Вы не должны передавать аргументы так, как вы делаете. Вместо этого вы должны передать аргумент функции в качестве аргументов QtConcurrent::run, см. Документы here.

Ваш вызов должен выглядеть следующим образом:

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

Этот способ QtConcurrent скопирует аргументы, которые вы прошли и выполнить вызов функции в потоке от значения по умолчанию QThreadPool.

If I call the function like this:

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); 
           ^~~~~~~~~~ 

Если вы должны вызвать нестатические функции члена в вашем классе, вы должны передать объект, который вы хотите запустить функцию, см here документов. Предполагая, что вы используете QtConcurrent::run из другой функции члена в классе (так как вы получите другую ошибку, если нет), вы должны сделать что-то вроде этого:

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

Обратите внимание, что, вы должны убедиться, что это все обращения к общим данным (между обоими потоками) должны быть сериализованы (возможно, с использованием QMutex).

+0

Я отредактировал вопрос. Я получаю другую ошибку, используя эту технику. – jocala

+0

@jocala, я отредактировал свой ответ соответственно. – Mike

+0

Спасибо! Мои ошибки компиляции исчезли. – jocala

 Смежные вопросы

  • Нет связанных вопросов^_^