亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教下面函數出現的錯誤問題,是怎么一回事???

請教下面函數出現的錯誤問題,是怎么一回事啊?

Helenr 2023-03-02 22:18:14
第一個函數: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對應釋放。


查看完整回答
反對 回復 2023-03-06
  • 1 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號