MFC多線程


MFC的多線程函數必須聲明爲靜態的或者是全局函數(不同的在於全局函數不能訪問類的私有靜態成員,而靜態類函數可以:但這樣的線程函數只能訪問靜態的成員變量,要實現訪問類的其他成員,可以這樣實現:

1)全局函數。如   UINT   MyThread(LPVOID   p)
2)類的靜態成員函數。如   static   UINT   MyView::MyThread(LPVOID   p) 
假設你有一個類
class   A
{
public:
      A();
      UNIT   ThreadProc();   //用它來作爲你的線程
protected:
      void   beginthread();
}

UNIT   _ThreadProc(LPVOID   lpParam)                          //可以聲明爲static類型,作爲類的成員函數  
{
    A   *pA   =   (A   *)lpParam;
    return   pA-> ThreadProc();
}

void   A::beginthread()
{
    AfxBeginThread(_ThreadProc,   (LPVOID)this);
}
所謂靜態的,就是屬於類的,而不是屬於對象的
從內存的角度來說:
一個類,如果不聲明對象,
那麼其一般成員函數就不佔用內存
但是靜態的卻仍然佔用內存!

 AfxBeginThread和CreateThread具體區別

1. 具體說來,CreateThread這個 函數是windows提供給用戶的 API函數,是SDK的標準形式,在使用的過程

中要考慮到進程的同步與互斥的關係,進程間的同步互斥等一系列會導致操作系統死鎖的因素,用起來比較繁

瑣一些,初學的人在用到的時候可能會產生不可預料的錯誤,建議多使用AfxBeginThread是編譯器對原來的

CreateThread函數的封裝,用與MFC編程(當然,只要修改了項目屬性,console和win32項目都能調用)而_

beginthread是C的運行庫函數。

在使用AfxBeginThread時,線程函數的定義爲:UINT   _yourThreadFun(LPVOID   pParam)參數必須如此

在使用CreateThread時,線程的函數定義爲: DWORD WINAPI _yourThreadFun(LPVOID pParameter)

2.CreateThread:是Windows的API函數,直截了當的創建了線程。 它沒有考慮:

1)C Runtime中需要對多線程進行紀錄和初始化,以保證C函數庫工作正常(典型的例子是strtok函數)。

2)MFC也需要知道新線程的創建,也需要做一些初始化工作(當然,如果沒用MFC就沒事了)。

_beginthreadex:MS對C Runtime庫的擴展函數,首先針對C Runtime庫做了一些初始化的工作,以保證

C Runtime庫工作正常。然後,調用CreateThread真正創建線程。

AfxBeginThread:MFC中線程創建的函數,首先創建了相應的CWinThread對象,然後調用

CWinThread::CreateThread, 在CWinThread::CreateThread中,完成了對線程對象的初始化工作,

然後,調用_beginthreadex創建線程。

如 果用MFC編程,不要用CreateThread,如果只是使用Runtime Library,用_BegingThread,總之,不要輕易使用CreateThread。這是因爲在MFC和RTL中的函數有可能會用到些它們所封 裝的公用變量,也就是說AfxBeginThread和_BeginThread都有自己的啓動代碼是CreateThread所沒有的。在用 CreateThread所創建的線程中使用MFC的類和RTL函數就有可能出現問題。如果你是用匯編編寫win32程序並且在線程函數中也不調用MFC 和RTL的函數,那用CreateThread就沒問題,或者你雖然是用C寫線程函數,但你很小心沒調用RTL函數也不會有問題。

  CreateThread是由操作系統提供的接口,而AfxBeginThread和_BeginThread則是編譯器對它的封裝。

發佈了8 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章