VC啟動一個新執行緒的三種方法
第一種AfxBeginThread()
用AfxBeginThread()函式來建立一個新執行緒來執行任務,工作者執行緒的AfxBeginThread的原型如下:
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID lParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);//用於建立工作者執行緒
返回值: 成功時返回一個指向新執行緒的執行緒物件的指標,否則NULL。
pfnThreadProc : 執行緒的入口函式,宣告一定要如下: UINT MyThreadFunction(LPVOID pParam),不能設定為NULL;
pParam : 傳遞入執行緒的引數,注意它的型別為:LPVOID,所以我們可以傳遞一個結構體入執行緒.
nPriority : 執行緒的優先順序,一般設定為 0 .讓它和主執行緒具有共同的優先順序.
nStackSize : 指定新建立的執行緒的棧的大小.如果為 0,新建立的執行緒具有和主執行緒一樣的大小的棧
dwCreateFlags : 指定建立執行緒以後,執行緒有怎麼樣的標誌.可以指定兩個值:
CREATE_SUSPENDED : 執行緒建立以後,會處於掛起狀態,直到呼叫:ResumeThread
0 : 建立執行緒後就開始執行.
lpSecurityAttrs : 指向一個 SECURITY_ATTRIBUTES 的結構體,用它來標誌新建立執行緒的安全性.如果為 NULL,
那麼新建立的執行緒就具有和主執行緒一樣的安全性.
如果要線上程內結束執行緒,可以線上程內呼叫 AfxEndThread.
一般直接用AfxBeginThread(ThreadProc,this);
示例:
- UINT myproc(LPVOID lParam)
- {
- CITTDlg *pWnd = (CITTDlg *)lParam; //將視窗指標賦給無型別指標
- pWnd->KMeansSegment(); //要執行的函式
- return 1;
- }
- void CITTDlg::KMeansSegment()
- {
- // 主要處理函式在這裡寫
- }
- void CITTDlg::OnKMeansSegment() //按鈕點選執行
- {
- AfxBeginThread(myproc, (LPVOID)this);//啟動新的執行緒
- }
注意,工作者執行緒的函式必須是全域性函式或靜態成員函式,不能是普通的成員函式。
第二種CreateThread()
NULL, // 沒有安全描述符
0, // 預設執行緒棧的大小
MyThreadProc, // 執行緒函式指標,即函式名
(LPVOID)&n, // 傳遞引數
NULL, // 沒有附加屬性
NULL // 不需要獲得執行緒號碼
);
- .h標頭檔案
- struct hS
- {
- CString Tmp;
- CTestDlg *hWnd;
- };//定義全域性結構體,用來傳遞自定義訊息
- DWORD WINAPI ThreadProc(LPVOIDlpParam);//執行緒函式宣告,全域性函式
- public:
- CString chtmp;
- struct hS *hTmp;
- protected:
- HANDLE m_hThread;//執行緒控制程式碼
- CEdit m_Edit;
- .cpp實現檔案
- //執行緒執行函式
- DWORD WINAPI ThreadProc(LPVOID lpParam)
- {
- //在這裡寫處理函式
- struct hS *Tmp2;
- Tmp2 = (hS*)lpParam;
- // 操作:
- Tmp2->hWnd->m_Edit.SetWindowText( (LPTSTR)Tmp2->Tmp );
- }
- void CTestDlg::OnBnClickedButton1()
- {
- hTmp->Tmp = chtmp;
- hTmp->hWnd = this;//關鍵是把this指標傳進去
- m_hThread =CreateThread(NULL,0,ThreadProc,hTmp,0,NULL);//建立新執行緒
- CloseHandle(m_hThread );
- }
用CreateThread()函式建立執行緒將返回一個執行緒控制程式碼,通過該控制程式碼你可以控制和操作該執行緒,當你不用時可以一建立該執行緒後就關閉該控制程式碼,有專門的函CloseHandle()。關閉控制程式碼不代表關閉執行緒,只是你不能在外部控制該執行緒(比如,提前結束,更改優先順序等)。線上程結束後,系統將自動清理執行緒資源,但並不自動關閉該控制程式碼,所以執行緒結束後要記得關閉該控制程式碼。
第三種_beginthread()
void( *start_address )( void * ), //指向新執行緒呼叫的函式的起始地址
unsigned stack_size, //堆疊大小,設定0為系統預設值
void *arglist //傳遞給執行緒函式的引數,沒有則為NULL
);
返回值:
假如成功,函式將會返回一個新執行緒的控制程式碼,使用者可以像這樣宣告一個控制程式碼變數儲存返回值:
HANDLE hStdOut = _beginthread( CheckKey, 0, NULL )。如果失敗_beginthread將返回-1。
#include <process.h>
對於_beginthread()建立的執行緒,其執行緒函式定義為:
void ThreadPro(void * pArguments );
相關文章
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- Java多執行緒【三種實現方法】Java執行緒
- Java建立多執行緒的一種方法Java執行緒
- 建立執行緒的三種方式執行緒
- 建立執行緒的4種方法 and 執行緒的生命週期執行緒
- 「有點收穫」三種基本方法建立執行緒執行緒
- 【 Thread】建立執行緒的2種方法thread執行緒
- 畫江湖之 PHP 多執行緒開發 【建立一個新的執行緒】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [建立一個新的執行緒]PHP執行緒
- JAVA執行緒池原理原始碼解析—為什麼啟動一個執行緒池,提交一個任務後,Main方法不會退出?Java執行緒原始碼AI
- 執行緒啟動原理執行緒
- Java併發(三)----建立執行緒的三種方式及檢視程式執行緒Java執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- Swoole 啟動一個服務,開啟了哪些程式和執行緒?執行緒
- 終止java執行緒的2種方法Java執行緒
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- Springboot中使用執行緒池的三種方式Spring Boot執行緒
- Java實現多執行緒的三種方式Java執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- join方法應用之一——按順序輸出三個執行緒執行緒
- 手動造一個執行緒池(Java)執行緒Java
- 多執行緒(五)---執行緒的Yield方法執行緒
- 加入一個執行緒執行緒
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- 死磕 java執行緒系列之自己動手寫一個執行緒池Java執行緒
- 本地啟動服務的三種方法
- 一個SystemC執行緒與SystemVerilog執行緒通訊的例子執行緒
- 【JUC】1-Java執行緒的啟動Java執行緒
- Java基礎:執行緒的三種建立方式Java執行緒
- JS引擎執行緒的執行過程的三個階段JS執行緒
- 怎樣停止一個正在執行的執行緒執行緒
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- Tomcat 配合虛擬執行緒,一種新的程式設計體驗Tomcat執行緒程式設計
- 直播商城原始碼,android執行緒的介紹及兩種啟動方式原始碼Android執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒
- 深入分析3種執行緒池執行任務的邏輯方法執行緒