MFC 的 Lock 主要是由以下這幾項構成︰
CSemaphore mutex; // 全域變數,用來計數 lock 數
CSingleLock wait(&mutex); // 操作 lock 的類別
wait.Lock(INFINITE); // 要求鎖定 mutex
wait.Unlock(); // 要求解鎖 mutex
當程式嘗試呼叫 wait.Lock(INFINITE); 鎖定 mutex 時,若 mutex 已經在其他地方被鎖定,則程式在此處會停擺,直到其他地方解除鎖定。
#include "testview.h"*************************************************************************************
#include <>
CSemaphore mutex; // 宣告
UINT ChildThread_Function ( LPVOID param )
{
CSingleLock wait(&mutex); // 操作 mutex 的類別
wait.Lock(INFINITE); // 要求鎖定 mutex
CTestView* view = (CTestView*) param;
param->DoSomething();
wait.Unlock(); // 要求解鎖 mutex
}
CTestView::DoSomething()
{
....
}
CTestView::Execute()
{
AfxBeginThread( ChildThread_Function, (LPVOID) this, THREAD_PRIORITY_ABOVE_NORMAL); // 呼叫子執行緒
}
若目的只要要求同一個 ChildTread 同一時間只能有一個執行,則可以使用較簡單的 Critical Section 方法。
CRITICAL_SECTION csObject; // 宣告為全域
InitialCriticalSection(&csObject); // 在主程式中初始化
EnterCriticalSection(&csObject); // 在ChildThread的開頭呼叫
LeaveCriticalSection(&csObject); // 在 ChildThread的結尾呼叫
#include "testview.h"
#include <>
CRITICAL_SECTION csObject; // 宣告
UINT ChildThread_Function ( LPVOID param )
{
EnterCriticalSection(&csObject); // 鎖定
CTestView* view = (CTestView*) param;
param->DoSomething();
LeaveCriticalSection(&csObject); // 解鎖
}
CTestView::CTestView()
{
InitialCriticalSection(&csObject); // 初始化
}
CTestView::DoSomething()
{
....
}
CTestView::Execute()
{
AfxBeginThread( ChildThread_Function, (LPVOID) this, THREAD_PRIORITY_ABOVE_NORMAL); // 呼叫子執行緒
}
No comments:
Post a Comment