AfxBeginThread的介紹 基本用法

2021-07-14 02:12:35 字數 2022 閱讀 9063

afxbeginthread

使用者介面執行緒和工作者執行緒都是由afxbeginthread建立的。現在,考察該函式:mfc提供了兩個過載版的afxbeginthread,乙個用於使用者介面執行緒,另乙個用於工作者執行緒,分別有如下的原型和過程:

使用者介面執行緒的afxbeginthread 

工作者執行緒的afxbeginthread

工作者執行緒的afxbeginthread的原型如下:

cwinthread* afxapi afxbeginthread(

afx_threadproc pfnthreadproc, 

lpvoid pparam,

int npriority, 

uint nstacksize, 

dword dwcreateflags,

lpsecurity_attributes lpsecurityattrs)

其中:引數1  執行緒的入口函式,宣告一定要如下: uint mythreadfunction( lpvoid pparam );

引數2 傳遞入執行緒的引數,注意它的型別為:lpvoid,所以我們可以傳遞乙個結構體入執行緒.

引數3、4、5分別指定執行緒的優先順序、堆疊大小、建立標識、安全屬性,含義同使用者介面執行緒。

附錄a

結束執行緒的兩種方式

當你在後台用執行緒來列印一些圖形時.有時在列印一部分後,你希望可以停下來,那麼此如何讓執行緒停止呢.下

面會詳細的向你解釋要結束執行緒的兩種方式

1 : 這是最簡單的方式,也就是讓執行緒函式執行完成,此時執行緒正常結束.它會返回乙個值,一般0是成功結束,

還是老師的那個專案,以前由於計算量太大,導致程式經常出現假死的現象,因為程式只有乙個執行緒,該執行緒主要用於處理計算上了,而對於訊息佇列的響應被忽略了。因此解決的辦法就是用兩個執行緒,乙個執行緒用於計算,乙個執行緒用於處理訊息。

到網上找了一些資料,發現在mfc中把執行緒分為兩類,一類為介面執行緒,一類為工作執行緒。兩者的區別在於前都能夠處理訊息響應,而後者則不能。對於該專案來說,只要把計算的過程放到乙個工作執行緒裡來進行就可以了。

現在先試一下,我新建了乙個對話方塊,上面新增兩個按鈕,乙個是start 乙個是dialog。前者用於開始計算,而後者則彈出乙個訊息框。然後向該對話方塊裡面新增乙個死迴圈的函式

uint cmultithreaddlg::jisuan(lpvoid lpparam)

return 0;

}然後在start按鈕的響應函式上新增上jisuan(null);即可,現在執行程式,按下start按鈕後,可以看到cpu使用率漲到了100%,這個時候再按dialog按鈕無反應,拖動關閉視窗均無效。這就是前面提到的假死現象(實際上是真死,因為死迴圈了,如果不是死迴圈,而只是計算量太大才是假死)。

其實上面的那個afxbeginthread,除前面兩個引數外,後面的都是預設引數,可以省略。而必須有的這兩個引數,乙個是執行緒函式的指標,乙個是傳遞給這個函式的引數。實際中我們經常這樣用 afxbeginthread(threadproc,this);//把this傳過去,就可以呼叫類的成員了. 這樣執行緒函式就可以使用和操作類的成員了。千萬要注意執行緒函式是靜態類函式成員。

執行緒是建立了,但是如果中途要暫停該怎麼做呢?

我們在建立執行緒的時候獲得了乙個cwinthread的指標,這是乙個指向執行緒物件的指標,cwinthread類裡面就有暫停與恢復的函式,下面我就演示一下。

在原來的程式上進行改動。向對話方塊類裡面新增乙個cwinthread* 的成員變數,不用初始化為null,這樣會報錯的,因為它只能通過afxbeginthread函式獲得。把start裡面的宣告去掉。

然後新增乙個 pause 按鈕向其響應函式裡面新增** mythread->suspendthread();   再新增乙個 resume按鈕,向其響應函式裡面新增 mythread->resumethread();

再執行程式,我們start之後,按下pause可以看到cpu恢復正常,然後resume,cpu又漲上去了,到此證明一切操作正常。

AfxBeginThread 幹了什麼?

跟一跟afxbeginthread的原始碼就可以很容易的發現,它呼叫了 beginthreadex,注意這傢伙傳遞的可不是你傳進去的函式函式指標,它傳的是 afxthreadentry和乙個 afx thread startup的結構,那我們的函式指標和引數呢?哦,原來都被封裝到 afx threa...

AfxBeginThread函式初探

在進行多執行緒程式設計的時候,我們經常用到afxbeginthread函式來啟動一條執行緒 該函式使用起來非常的簡單方便,其定義如下 cwinthread afxbeginthread afx threadproc pfnthreadproc,執行緒函式位址 lpvoid pparam,執行緒引數 ...

AfxBeginThread建立執行緒

使用者介面執行緒和工作者執行緒都是由afxbeginthread建立的。mfc提供了兩個過載版的afxbeginthread,乙個用於使用者介面執行緒,另乙個用於工作者執行緒,分別有如下的原型 使用者介面執行緒的afxbeginthread的原型如下 cwinthread afxapi afxbeg...