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

看板C_and_CPP (C/C++)作者 (VF-17)時間11年前 (2015/03/13 10:13), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《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

03/15 00:45, , 1F
謝謝您費心的回覆!!! 多執行緒對我來說很陌生><
03/15 00:45, 1F

03/15 00:45, , 2F
我會好好研究看看的 再次感謝您!!
03/15 00:45, 2F
文章代碼(AID): #1L0aUu5T (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1L0aUu5T (C_and_CPP)