1. 程式人生 > >Qt concurrent run()函式使用

Qt concurrent run()函式使用

QFuture<T>run(constClass*object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constArg1 &arg1,constArg2 &arg2,constArg3 &arg3,constArg4 &arg4,constArg5 &arg5)

run()函式的原型如上,此函式是QtConcurrent名稱空間裡的函式.主要功能是令啟動一個執行緒來執行一個函式.Concurrent的英文示意就是併發的意思.

下面簡要的介紹run()函式的使用方法:

1.首先要有一個需要在另外開啟的執行緒中執行的函式:

voidthread_add(QObject*receiver,inta,intb)

{
QStringmessage=QString("%1+%2=%3").arg(a).arg(b).arg(a+b);
QApplication::postEvent(receiver,newProgressEvent(true,message));
}

函式線上程中執行完畢後會向receiver傳送一個訊息,來返回結果.

2.有了要線上程中執行的函式,再來看看怎麼啟動執行緒來執行這個函式

voidMainWindow::on_pushButton_clicked()

{
for(inti=0;i<
9;i++)
for(intj=0;j<9;j++)
QtConcurrent::run(thread_add,this,i,j);
}

點選一個按鈕就會執行這段程式碼,然後啟動8*8=64個執行緒,執行緒要執行的函式就是thread_add(之前定義的),訊息接收物件就是MainWindow這個類的例項

3.執行緒得到了執行會發送訊息給MainWindow,MainWindow重新實現boolMainWindow::event(QEvent*event)處理接收到的訊息,並顯示出來

boolMainWindow::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);
returntrue;
}
returnQMainWindow::event(event);
}

再給出自定義的訊息結構

structProgressEvent:publicQEvent

{
enum{EventId=QEvent::User};
explicitProgressEvent(boolsaved_,constQString&message_)
:QEvent(static_cast<Type>(EventId)),
saved(saved_),message(message_){}
constboolsaved;
constQStringmessage;
};

相關推薦

Qt concurrent run函式使用

QFuture<T>run(constClass*object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constArg1 &arg1,constArg2 &arg2,cons

Qt中關於setGeometry函式的問題

這裡是QT文件裡的。 Note that QDialog (an any other widget that has type Qt::Dialog) uses the parent widget slightly differently from other classes in Qt. A dialog

線程的啟動的兩種方法,Runnable接口,run的調用

ride 之前 線程終止 源碼解析 star 有意 tro thread類 override 實現並啟動線程有兩種方法1、寫一個類繼承自Thread類,重寫run方法。用start方法啟動線程2、寫一個類實現Runnable接口,實現run方法。用new Thread(Ru

多線程startrun區別

通過 系統 調用 tar start 時間片 運行 實現 狀態 start()用來啟動一個線程,當調用start()方法時,系統才會開啟一個線程,通過Thread類中的start()方法來啟動的線程處於就緒狀態(可運行狀態),此時並沒有運行,一旦得到CPU時間片,

Thread的run與start的區別

目的 程序 結束 生成 復制代碼 lee main 線程調度 順序 Java的線程是通過java.lang.Thread類來實現的。VM啟動時會有一個由主方法所定義的線程。可以通過創建Thread的實例來創建新的線程。每個線程都是通過某個特定Thread對象所對應的方法ru

pandas stack函式可用於轉置,但功能絕不僅僅限於轉置。真正的轉置是df.T

實際上轉置是df.T http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-and-pivot-tables  Reshaping and Pivot Tables R

模式對話方塊和非模式對話方塊、accept函式、exec函式,Accepted訊號區別

一.非模式對話方塊   非模式對話方塊是和同一個程式中其它視窗操作無關的對話方塊。在字處理軟體中查詢和替換對話方塊通常是非模式的來允許同時與應用程式主視窗和對話方塊進行互動。呼叫show()來顯示非模式對話方塊。show()立即返回,這樣呼叫程式碼中的控制流將會繼續。   非模式

Python:range函式

range() 函式 range(stop) 用來生成0~stop區間內的整數,直到stop為 止(不包含stop) range(start, stop[,step]) 用來生成start~stop區 間內的整數,直到stop為止(不包含s

np.nonzero函式用法

返回陣列中不為0的元素的下標。 陣列中元素可為布林、整型和浮點型,返回值為元祖 一.一維陣列 1.陣列元素為布林型別 a=np.array([True,False,True,False]) b=np.nonzero(a) print(b) 輸出結果為(array([0, 2], dtype

python中的encode和decode函式

前言: 我們知道,計算機是以二進位制為單位的,也就是說計算機只識別0和1,也就是我們平時在電腦上看到的文字,只有先變成0和1,計算機才會識別它的意思。這種資料和二進位制的轉換規則就是編碼。計算機的發展中,有ASCII碼,GBK,Unicode,utf-8編碼。我們先從編碼的發展史瞭解一下編碼的進化過程。

python中的open函式

定義: python open() 函式用於開啟一個檔案,建立一個 file 物件,相關的方法才可以呼叫它進行讀寫 引數: 模式 描述 r 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。 rb 以

關於執行緒的run、start、join方法

一、run()和start() run:run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。 start:用st

numpy的cumsum 函式

cumsum是matlab中一個函式,通常用於計算一個陣列各行的累加值,函式用法是B = cumsum(A,dim),或B = cumsum(A)。   函式功能 呼叫格式及說明 格式一:B = cumsum(A) 這種用法返回陣列不同維數的累加和。

eval函式的理解

  import tensorflow as tf import numpy as np with tf.variable_scope("test1",initializer=tf.constant_initializer(0.4)): var1=tf.get_variabl

詳解JavaScript中的replace函式

  Javascript中字串物件有一個方法replace(),它的作用非常強大。這裡把它的用法整理一下。   一、方法簡介   該方法的簽名是:replace([RegExp|String],[String|Function])。   該方法 返回一個新的字串,但並不改變字串本身。

ucosII移植學習過程,OS_CPU_SR_Save()和OS_CPU_SR_Restore函式的解析

今天突然興起回顧了一下ucosII,本人在這方面也是小白,但研究了一下,也算有點收穫,在此記錄一下。 我們都知道,程式碼的臨界段,也叫臨界區,指的是處理時不可以分割的程式碼。一旦這部分程式碼開始執行,則不容許任何中斷打斷。為了確保臨界段程式碼的可靠執行,在進入臨界段之前一定要關閉中斷,而臨界段執

sprintf函式的用法

sprintf函式的格式:int sprintf( char *buffer, const char *format [, argument,...] ); 除了前兩個引數固定外,可選引數可以是任意個。buffer是字元陣列名;format是格式化字串 常用方式 sprintf函式的功能與print

python中的分支和迴圈:for 迴圈,while迴圈,三元操作符,斷言,assert關鍵字,rang函式總結

1.python中的條件語句 例:score=int(input('請輸入一個分數'))        if 100>=score>=90:              

C語言學習筆記:printf函式詳解

C語言中有關printf()函式的詳細使用方法: 修飾符: - digit(s) :欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統就會使更寬的欄位。 如%4d。 - .digit(s):精度,將結果保留到小數點後的多少位。 - h: 和整數轉

CAST函式用法

Cast(欄位名 as 轉換的型別 ),其中型別可以為:CHAR[(N)] 字元型 DATE  日期型DATETIME  日期和時間型DECIMAL  float型SIGNED  intTIME  時間型例如表table1date2015-11-03 15:31:26sele