CreateThread建立執行緒傳遞結構體引數

2021-06-04 12:04:19 字數 2598 閱讀 3665

一般mfc建立執行緒的函式用的最多的有兩個:afxbeginthread和createthread。首先來學習createthread。

createthread執行緒函式及引數如下:

handle createthread(

lpsecurity_attributes lpthreadattributes,  // pointer to security attributes

dword dwstacksize,                         // initial thread stack size

lpthread_start_routine lpstartaddress,     // pointer to thread function

lpvoid lpparameter,                        // argument for new thread

dword dwcreationflags,                     // creation flags

lpdword lpthreadid                         // pointer to receive thread id

);第乙個引數是指向security_attributes型態的結構的指標。在windows 98中忽略該引數。在windows nt中,它被設為null。

第二個引數是用於新執行緒的初始堆疊大小,預設值為0。在任何情況下,windows根據需要動態延長堆疊的大小。

第三個引數是執行緒函式的名稱。函式名稱沒有限制,但是最好以以下列形式宣告:

dword winapi threadproc (lpvoid pparam) ;

第四個引數為傳遞給threadproc的引數。這樣主線程和從屬執行緒就可以共享資料。

第五個引數通常為0,但當建立的執行緒不馬上執行時為旗標create_suspended。執行緒將暫停直到呼叫resumethread來恢復執行緒的執行為止。

第六個引數是乙個指標,指向接受執行緒id值的變數。

函式介紹完成後,接下來要做的是如何把結構體變數傳遞到執行緒執行函式當中。有時候兩個執行緒之間需要共享的資料比較多,那麼用結構體來傳遞資料時必然的選擇。

首先宣告乙個結構體threadprameter:

struct threadparameter;

然後在建立執行緒之前生成乙個結構體例項:

threadparameter tp;

tp.id = 1;

char name[20];

name = "tom";

tp.name = name;

然後開始建立執行緒,將結構體的指標新增到函式裡面:

handle threadhandle = createthread(null,0,(lpthread_start_routine)threadfuncion,&tp,0,null);

注意:第三個引數之前的

lpthread_start_routine一定要加上,不然會報錯。

最後完成執行緒函式threadfunction:

dword winapi threadfunction (lpvoid pparam)

最後別忘了程式退出時closehandle(threadhandle);

附:--------------------

2011-12-20 22:05

84人閱讀收藏 

舉報問題:

用vc建立新執行緒易出的問題error c2664: 'createthread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

解決方案:

(1)如果執行緒要執行的是類的成員函式,則必須用static宣告為靜態函式   

如:   

class   echo   

(2)一般都是呼叫全域性函式.

我們在用createthread(null,0,threadproc,null,0,null)建立執行緒得時候,此函式中需要新執行緒中的函式地 址,我們常用的有兩種方法解決:

一.將我們要呼叫的新執行緒函式宣告成dword winapi threadproc(lpvoid lpparameter)。

二.我們可以將新執行緒函式宣告成類中的成員函式:static dword winapi threadproc(lpvoid lpparameter)

但是當我們的寫法不正確的時候,往往會出現error c2664: 'createthread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' 這個問題,另我們這些初學者很是惱火,現將可能出現的這種情況列舉如下:

第一種方法的使用是將新執行緒要處理的函式寫在類外的一種的情況也就是全域性函式,非類成員函式,需要注意的就是在建立新執行緒之前要宣告該函式或定義函式,要 注意這時不要在該類的標頭檔案新增該函式的宣告(我就犯過這樣的錯誤)。記住用完要釋放哦!

第二種方法的使用是將新執行緒中要處理的函式定義成本類中的成員,使用時要注意一定要吧該函式宣告成static型別的,否則就會報錯error c2664。

CreateThread函式 建立執行緒

微軟在windows api中提供了建立新的執行緒的函式createthread,概述 當使用createprocess呼叫時,系統將建立乙個程序和乙個主線程。createthread將在主線程的基礎上建立乙個新執行緒,大致做如下步驟 1在核心物件中分配乙個執行緒標識 控制代碼,可供管理,由crea...

CreateThread建立執行緒傳遞結構體引數

分類 visual c 13111 2 舉報 收藏一般mfc建立執行緒的函式用的最多的有兩個 afxbeginthread和createthread。首先來學習createthread。createthread執行緒函式及引數如下 handle createthread lpsecurity att...

CreateThread 方法建立執行緒時出錯

最近在使用createthread 方法建立執行緒時提示以下錯誤 我的環境如下 1.vs2019 2.mfc基於對話方塊 查閱孫鑫寫的書 vc 深入詳解 修訂版多執行緒一章中,也提到過這個錯誤,解決方法是因為執行緒方法宣告在對話方塊的類中,成為了此類中的乙個方法,要在前面新增static修飾符,使其...