2013-04-22 59 views
2

所以我發現我的UI程序發生了一些問題,因爲我沒有使用線程。QFuture幫助,線程化C++ Qt

我看了一下,從我能在文檔中看到的QFuture看起來就像我需要的一樣,我是否正確地認爲這是在你有函數時使用,而你只是想在一個線程中運行?

權利,使假設即時糾正,我經歷的所有例子中的文檔和類型代碼,基本上它只是沒有在所有的工作......

UI.cpp

#include <QFuture> 
#include <QtConcurrent/QtConcurrentRun> 
#include "something.h" 
void UI::button_click() 
{ 
    something s; 
    QFuture<int> result = QtConcurrent::run(s.heavyFunction()); 

    result.waitForFinished(); 
} 

something.cpp

int something::heavyFunction() 
{ 
    // heavy code here 
    return 42; 
} 

OK顯然這心不是真正的代碼,但那裏有沒有什麼不同,這裏比我實際的代碼,但我得到以下錯誤

error C2780: 'QFuture<T> QtConcurrent::run(T (__cdecl *)(Param1),const Arg1 &)' : expects 2 arguments - 1 provided 

它說這個錯誤大約7次,基本上說1,2,3,4,5,6,7參數預計1提供?

我從一些例子中得到了這段代碼,所以我錯過了什麼想法?

回答

4

QtConcurrent::run將函數和參數傳遞給該函數。在成員函數的情況下,如something::heavyFunction採取T*類型,其中T是具有成員函數(something在這種情況下)類型的隱含參數,你會需要像

something s; 
QFuture<int> result = QtConcurrent::run(&s, &something::heavyFunction); 

成員函數。 QtConcurrent::run似乎是通過將實例作爲第一個參數並將成員函數作爲第二個參數來處理的。這看起來不自然並且反直覺,並且與例如std::async

+0

確定iv嘗試了這個,但現在我得到的誤差項不計算爲一個函數採取一個參數... – AngryDuck 2013-04-22 15:55:23

+0

我的東西s;'聲明爲一個成員變量,但我認爲這沒有什麼區別? – AngryDuck 2013-04-22 15:56:22

+0

@AngryDuck它應該沒有區別。你只需要你想要運行成員函數的實例的地址。你傳遞的成員函數必須是'something'的成員。 – juanchopanza 2013-04-22 15:58:16