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