有時候在gui編程中需要調用一個非常耗費時間的api類的函數,這個時候不使用多線程的話界面就會卡死。使用多線程有一個非常簡單的辦法,不需要建立新的QThread派生類。
設需要調用的api定義為
bool demoDialog::threadDemo(QString realArgStr1, QString realArgStr2,int realArgInt)
{
////
...
////
}
如果不是qt的api函數,自己建立一個簡單的包裝函數就行了。要保證傳遞的參數都是qt變量,這裡不能傳遞指針
那麼在對話框的某個函數中這樣調用threadDemo
QFuture<bool> result = QtConcurrent::run(this,(&demoDialog::threadDemo),realArgStr1,realArgStr2,realArgInt);
while(result.isResultReadyAt(0)!= true)
{
QCoreApplication::processEvents();
}
if(result.result())
{
//success
}
else
{
//failed
}
就可以實現界面不卡死而在新的線程中運行threadDemo(),threadDemo()返回後新線程自動退出。
這個辦法的缺點是,api運行期間cpu占用非常的高,是processEvents導致的。