2016-10-06 129 views
1

我有一個遞歸目錄複製函數我想在後臺運行。該函數接受兩個QString參數,filepath和dir。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