QtConcurrent::run() 的使用


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;
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM