QThreadPool類和QtConcurrent命名空間

 

1、QThreadPool類html

  QThreadPool管理一組線程。它負責管理和回收單個QThread對象以減小程序中線程建立的開銷。每一個Qt應用程序都有一個全局的QThreadPool對象,可經過方法globalInstance()得到。爲了調用QThreadPool中的一個線程,須要提供一個從QRunnable繼承過來的類,並實現其中的run方法。而後建立一個該類的對象,傳遞給QThreadPool::start()方法。代碼片段以下:docker

[cpp]  view plain  copy
 
  1. class HelloWorldTask : public QRunnable  
  2.  {  
  3.      void run()  
  4.      {  
  5.          qDebug() << "Hello world from thread" << QThread::currentThread();  
  6.      }  
  7.  }  
  8.   
  9.  HelloWorldTask *hello = new HelloWorldTask();  
  10.  // QThreadPool takes ownership and deletes 'hello' automatically  
  11.  QThreadPool::globalInstance()->start(hello);  

默認狀況下, QThreadPool自動刪除QRunnable對象。使用QRunnable::setAutoDelete()方法能夠改變該默認行爲。QThreadPool支持在QRunnable::run方法中經過調用tryStart(this)來屢次執行相同的QRunnable。當最後一個線程退出run函數後,若是autoDelete啓用的話,將刪除QRunnable對象。在autoDelete啓用的狀況下,調用start()方法屢次執行同一QRunnable會產生競態,就避免這樣作。編程

  那些在必定時間內會使用的線程將會過時。默認的過時時間是30秒。可經過setExpiryTimeout()方法來設置。設置一個負數的超時值表明禁用超時機制。方法maxThreadCount()能夠查詢可以使用的最大線程數,你也能夠設置最大的線程數。activeThreadCount反應的是當前正在被使用中的線程數個數。reserveThread函數保留某個線程爲外部使用,releaseThread釋放該線程,這樣就能夠被再次使用。多線程

2、QtConcurrent命名空間app

QtConcurrent命名空間裏提供了一些高級API,利用這些API能夠編寫多線程程序,而不用直接使用比較低級的一些類,如mutext,lock, waitcondition以及semaphore等。使用QtConcurrent命令空間的API編寫的程序會根據處理器的數目自動地調整線程的個數。QtConcurrent包含了用於並行列表處理的函數式編程,包含實現共享內存系統的MapReduce和FilterReduce, 以及管理GUI應用程序中異步計算的類。相關的類說明以下:異步

QtConcurrent::map()函數式編程

appliesa function to every item in aContainer, modifying the itemsin-place函數

QtConcurrent::mapped()this

islike map(), except that it returns a new container with themodificationsspa

QtConcurrent::mappedReduced()

islike mapped(), except that the modified results are reduced orfolded into a single result.

QtConcurrent::filter()

litems from a container based on the result of a filter function.

QtConcurrent::filtered()

islike filter(), except that it returns a new container with thefiltered results

QtConcurrent::filteredReduced()

islike filtered(), except that the filtered results are reduced orfolded into a single result

QtConcurrent::run() 

runsa function in another thread.

QFutureIterator

allowsiterating through results available via QFuture.

QFutureWatcher

allowsmonitoring a QFuture usingsignals-and-slots.

QFutureSynchronizer

isa convenience class that automatically synchronizes severalQFutures.

代碼實例:

[cpp]  view plain  copy
 
  1. using namespace QtConcurrent;  
  2. void hello(QString name)  
  3. {  
  4.     qDebug() << "Hello" << name << "from" << QThread::currentThread();  
  5. }  
  6. int main(int argc, char **argv)  
  7. {  
  8.     QApplication app(argc, argv);  
  9.     QFuture<void> f1 = run(hello, QString("Alice"));  
  10.     QFuture<void> f2 = run(hello, QString("Bob"));  
  11.     f1.waitForFinished();  
  12.     f2.waitForFinished();  
  13.     return app.exec();  
  14. }  
  15. http://blog.csdn.net/fuyajun01/article/details/7075979
相關文章
相關標籤/搜索