第一个函数:BOOL CMutexDlg::OnInitDialog(){GloMutex = ::CreateMutex(NULL, FALSE, "Mutex1"); //创建互斥信号量ReleaseMutex(GloMutex);CWinThread *pTSocket = AfxBeginThread(SktThreadFromSer, this, 。。。。)SetTimer(1,2000,NULL);SetTimer(2,5000,NULL);}第二个相关函数:void CMutexDlg::OnTimer(UINT nIDEvent) {if(nIDEvent == 1){int i = WaitForSingleObject(GloMutex, 0);SetDlgItemInt(IDC_STATIC,i);}if(nIDEvent == 2)ReleaseMutex(GloMutex);}第三个相关函数:UINT SktThreadFromSer(LPVOID pParm){while(1){WaitForSingleObject(GloMutex, INFINITE);AfxMessageBox("fdjasi");ReleaseMutex(GloMutex);Sleep(5500);}}说明:定时器1定时2秒,定时器2定时5秒,线程睡眠5.5秒,开始线程弹出消息框,然后释放互斥量,之后睡眠5.5秒,2秒后定时器1获取信号,4秒时还是获取信号,但此时返回结果应该是258啊,(0x102),但事实还是0,这是错误一,当5秒时释放信号信号,当5.5秒的时候线程醒来,应该会得到信号弹出消息框啊,事实上没有,这是错误二,请教原因!
1 回答
Qyouu
TA贡献1786条经验 获得超11个赞
只需要改一个地方,将:
if(nIDEvent == 2)
ReleaseMutex(GloMutex);
改为
if(nIDEvent == 2)
while(ReleaseMutex(GloMutex));
因为你的1号定时器执行频率较2号高,所以WaitForSingleObject被调用了多次,所以需要多个ReleaseMutex对应释放。
- 1 回答
- 0 关注
- 68 浏览
添加回答
举报
0/150
提交
取消