看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.120.66.84 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1426212792.A.15D.html
srxrrr: 謝謝您費心的回覆!!! 多執行緒對我來說很陌生>< 03/15 00:45
srxrrr: 我會好好研究看看的 再次感謝您!! 03/15 00:45