Re: [問題] Mutex的基本用法(MFC)

作者: Dforce (VF-17)   2015-03-13 10:13:09
※ 引述《srxrrr (幹!我是肌董)》之銘言:
: 平台: VS2010
: 函式庫: MFC
: ======================================================
: 謝謝大家前一篇提供的寶貴意見
: 現在我做了一個簡單的程式來測試Mutex的功能:
: 同一個程式開兩次(以下假設為A與B)
: 當按下A的Button1時 開始計數5秒並秀於螢幕
: 在5秒之內 也按下B的Button1
: 會發現B會等A計數完 才開始動作
: 但有時候(並不是每次發生) B開始動作時
: 整個程式會卡住 並在視窗上顯示"沒有回應"
: 等到計數完後 才可繼續使用B...
: 不知道是哪裡出了問題 = =a
: 以下為我的程式碼 希望各位熱心的板友 能提供點意見
: 感激不盡!!
: CMutex mutex(false,_T("Hughes")); //聲明一個具名的Mutex
: void CMutextestDlg::OnBnClickedButton1()
: {
: mutex.Lock(); //鎖住執行緒
: //計數5秒
: CString str;
: for(int i=0;i<=5;i++)
: {
: str.Format(_T("%d"),i);
: SetDlgItemText(IDC_STATIC,str);
: Sleep(1000);
: }
: SetDlgItemText(IDC_STATIC,_T("End")); //代表計數完成
: mutex.Unlock(); //開放執行緒
: }
弄成多執行緒就好了
原先 OnBnClickedButton1() => window message thread
加上 Thread B 用來計數並更新畫面的數字
原先 OnBnClickedButton1() 內的功能移到 Thread B
然後 OnBnClickedButton1() 只要負責喚醒 Thread B 該上工了
簡單示意
CMyDlg::CMyDlg(***)
{
m_hEvt = CreateEvent(***);
m_hThread = CreateThread(***, ThreadProc, this, ***);
}
static DWORD WINAPI CMyDlg::ThreadProc(LPVOID lParam)
{
return ( (CMyDlg*)(lParam) )->DoThread();
}
DWORD CMyDlg::DoThread()
{
while(1)
{
WaitforSingleObject(m_hEvt, INFINITE);
// 做原來 mutex 那段的事情
}
return 0;
}
作者: srxrrr (幹!我是肌董)   2015-03-15 00:45:00
謝謝您費心的回覆!!! 多執行緒對我來說很陌生><我會好好研究看看的 再次感謝您!!

Links booklink

Contact Us: admin [ a t ] ucptt.com