vc入門寶典六(多執行緒) (轉)

worldblog發表於2007-12-14
vc入門寶典六(多執行緒) (轉)[@more@]

多執行緒:namespace prefix = o ns = "urn:schemas--com::office" />

 

/develop/author/netauthor/he_zhidan/">何志丹

主要內容:

1,  工作者執行緒

2,  介面執行緒

3,  同步

執行緒被分為工作者執行緒和使用者使用者介面執行緒。使用者介面的執行緒的特點是擁有單獨的訊息佇列,可以具有自己的視窗介面,能夠對使用者輸入和事件作出反應。

 

可以用以下方法建立一個工作者執行緒。

UINT MyThreadProc(LPVOID pParam)

{

}

AfxBeginThread(MyThread,..);

它有六個引數,第一個為控制,第二個為啟動執行緒時傳給控制函式的入口引數,當前執行緒的優先順序,當前執行緒的棧的大小,當前執行緒的建立狀態,屬性,後四個有預設值。

 

使用者介面執行緒:

首先利用應用嚮導建立單文件程式Thread,再建立Thread1 : public CWinThread,

Frame1 : public CFrameWnd,可以用Ctrl+w建立這兩個新類。

  在CThreadApp中加一個指標Thread1* pThread1,在BOOL CThreadApp::InitInstance()

中進行初始化:

  pThread1 = new Thread1();

  pThread1->CreateThread();

將Thread1的建構函式改成公有。

  在Thread1中加一個指標Frame1* m_pWnd,然後初始化。

BOOL Thread1::InitInstance()

{

  m_pWnd = new Frame1();

  return TRUE;

}

把Frame1的建構函式改成公有,在Thread.h中包含#include "Frame1.h"。

  在資源編輯器中編輯一個選單IDR_MENU,它有一個選單項ID_BEGIN。

  Frame1::Frame1()

{

  Create(NULL,"Demo");

  ShowWindow(SW_SHOW);

  UpdateWindow();

 

  CMenu menu;//可以用區域性變數,因為以後不會用到它了,加選單。

  menu.LoadMenu(IDR_MENU);

  SetMenu(&menu);

}

同步

多執行緒的一個難點是各執行緒間的協調。同樣的方法在CThreadApp中再開一個執行緒。

BOOL CThreadApp::InitInstance()

{

  。。。。。。

  pThread1 = new Thread1();

  pThread1->CreateThread();

  pThread2 = new Thread1();

  pThread2->CreateThread();

  。。。。。。

}

為IDR_MENU中的選單在Frame1中設立響應函式,方法也是Ctrl+w開啟類嚮導。並在Frame1中定義一個全域性整形變數n,初始值為0.

HANDLE handle=CreateSemaphore(NULL,0,1,"he");

  WaitForSingle(handle,10000);

 

  CString str;

  n++;

  str.Format("第%d次工作",n);

  MessageBox(str);

  ReleaseSemaphore(handle,1,NULL);

當你點選Frame1的選單時,會彈出一個對話方塊,暫時不要點 確定,點選另一個執行緒的選單,暫不會彈出對話方塊,確定剛才的對話方塊,另一個執行緒的對話方塊也彈出來了。

這個同步的方法稱為訊號量。它允許有限的執行緒存取某個共享的資源,採用計數器來實現訊號量。

HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES  lpa,LONG cSemInitial,LONG cSemMax,LPTSR  lpszSemName);

第一個引數來指明所建立的是否可以被其子程式繼承。如果你希望在所有的子程式之間共享這個訊號量,可以把它的成員bInheritHandle設為true,也可以直接設為NULL來使用預設的安全設定第二個引數是還可以讓幾個執行緒使用,第三個引數是最多可以讓幾個執行緒使用。

最後引數是訊號量的名字,在其它的程式中CreateSemapphore()或OpenSemaphore()時使用這個字串作為引數之一就可以得到訊號量的控制程式碼。

  ReleaseSemaphore(HANDLE  hSemaphore, LONG cRelease,LPLONG plPrev)

  第二個表示一次釋放幾,

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993543/,如需轉載,請註明出處,否則將追究法律責任。

相關文章