QFuture<T>run(constClass
*object,T
(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,const
Arg1
&arg1,const
Arg2
&arg2,const
Arg3
&arg3,const
Arg4
&arg4,const
Arg5
&arg5)
run()函數的原型如上,此函數是QtConcurrent命名空間里的函數.主要功能是令啟動一個線程來執行一個函數.Concurrent的英文示意就是並發的意思.
下面簡要的介紹run()函數的使用方法:
1.首先要有一個需要在另外開啟的線程中執行的函數:
void thread_add(QObject*receiver,inta,intb)
{
QString message=QString("%1 + %2 = %3").arg(a).arg(b).arg(a+b);
QApplication::postEvent(receiver,new ProgressEvent(true, message));
}
函數在線程中運行完畢后會向receiver發送一個消息,來返回結果.
2.有了要在線程中運行的函數,再來看看怎么啟動線程來運行這個函數
void MainWindow::on_pushButton_clicked()
{
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
QtConcurrent::run(thread_add,this,i,j);
}
點擊一個按鈕就會運行這段代碼,然后啟動8*8=64個線程,線程要運行的函數就是thread_add(之前定義的),消息接收對象就是MainWindow這個類的實例
3.線程得到了運行會發送消息給MainWindow,MainWindow重新實現boolMainWindow::event(
QEvent*
event)處理接收到的消息,並顯示出來
bool MainWindow::event(
QEvent*
event)
{
if (event->type() ==
static_cast<QEvent::Type>(ProgressEvent::EventId)) {
ProgressEvent *progressEvent =
static_cast<ProgressEvent*>(event);
Q_ASSERT(progressEvent);
ui->teLog->append(progressEvent->message);
return true;
}
return QMainWindow::event(event);
}
再給出自定義的消息結構
struct ProgressEvent:
publicQEvent
{
enum {EventId = QEvent::User};
explicit ProgressEvent(bool saved_, const QString &message_)
: QEvent(static_cast<Type>(EventId)),
saved(saved_), message(message_) {}
const bool saved;
const QString message;
};