MFC 主介面函式中執行緒等待避免介面卡死的處理方法
實用場景:
例如在MFC主介面某個Button Click事件中起一個執行緒去做處理一些事情,在起的執行緒執行完畢後,接著跑Click起執行緒後的程式碼,已達到按順序執行,保證時許正確的目的。
問題:
通常處理一個執行緒等待用 WaitForSingleObject,這個放在主介面執行緒成中會造成主介面“卡死”,其原因是它將主介面的訊息迴圈給阻塞了,即等不到執行緒結束的時候介面上的訊息迴圈無法正常工作,從而造成介面“卡死”
處理辦法:
在等待執行緒的同時,讓訊息迴圈一直工作
示例
- UINT CMainUIThreadWaitDlg::StartThread(LPVOID pParam)
- {
- ((CMainUIThreadWaitDlg*)pParam)->ThreadWork();
- return 0;
- }
- void CMainUIThreadWaitDlg::ThreadWork()
- {
- OutputDebugString(_T("+++++Start+++++\r\n"));
- Sleep(20*1000);
- OutputDebugString(_T("++++++End+++++\r\n"));
- }
- void CMainUIThreadWaitDlg::DoEvent()
- {
- MSG msg;
- if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //取訊息,檢索應用程式的訊息佇列,PM_REMOVE取過之後從訊息佇列中移除
- {
- //發訊息
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- }
- }
- CWinThread* pThread = NULL;
- void CMainUIThreadWaitDlg::OnBnClickedBtnWork()
- {
- m_btnWork.EnableWindow(FALSE); //按鈕禁灰
- pThread = AfxBeginThread(StartThread,this); //起執行緒
- DWORD dwRet;
- DoEvent();
- do
- {
- dwRet = ::MsgWaitForMultipleObjects(1, &pThread->m_hThread, FALSE, INFINITE, QS_ALLINPUT);
- if (dwRet != WAIT_OBJECT_0)
- {
- DoEvent();
- }
- } while ((dwRet != WAIT_OBJECT_0) && (dwRet != WAIT_FAILED));
- m_btnWork.EnableWindow(TRUE); //按鈕點亮
- }
相關文章
- MFC多執行緒的建立,包括工作執行緒和使用者介面執行緒執行緒
- 154 、MFC中使用者介面執行緒執行緒
- (MFC)子執行緒的資料如何傳遞給主執行緒中?執行緒
- 使用Runnable介面實現執行緒的方法執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- Linux常用C函式—介面處理篇(轉)Linux函式
- QT中跨執行緒警告的處理QT執行緒
- Netty中的執行緒處理EventLoopNetty執行緒OOP
- 主執行緒等待所有其他執行緒執行完畢,然後再繼續執行主執行緒的邏輯,有以下幾種方法可以實現:執行緒
- MFC UI執行緒UI執行緒
- Handler後傳篇一: 為什麼Looper中的Loop()方法不能導致主執行緒卡死?OOP執行緒
- Thread 中的 join() 方法的作用是呼叫執行緒等待該執行緒執行完後,再繼續執行thread執行緒
- IO處理執行緒執行緒
- Runnable介面實現多執行緒執行緒
- 函式式介面函式
- java中多執行緒併發的處理方式Java執行緒
- 執行緒中的幾個退出相關函式執行緒函式
- 執行緒中呼叫fork函式,鎖的變化執行緒函式
- java8新特性之函式式介面、lambda表示式、介面的預設方法、方法和建構函式的引用Java函式
- 多執行緒常用函式執行緒函式
- Java執行緒面試題(02) Java執行緒中如何避免死鎖Java執行緒面試題
- js如何降低事件處理函式的執行頻率JS事件函式
- Java函式式介面Java函式
- 在單獨執行緒中執行物件成員函式 (轉)執行緒物件函式
- windows核心程式設計課程實踐---多執行緒檔案搜尋器(MFC介面)Windows程式設計執行緒
- TypeScript 函式介面TypeScript函式
- 函式型介面函式
- ORACLE鎖等待的處理方法Oracle
- 如何處理執行緒死鎖執行緒
- mysql 5.7 執行緒阻塞處理MySql執行緒
- JAVA不使用執行緒池來處理的非同步的方法Java執行緒非同步
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- JAVA中的函式介面,你都用過嗎Java函式
- Android 中 EventBus 的使用(3):多執行緒事件處理Android執行緒事件
- 建立執行緒的方式三:實現Callable介面執行緒
- c++如何使用pthread_join函式配合pthread_create函式來建立和等待執行緒完成,實現執行緒同步與控制C++thread函式執行緒
- pamie處理popup介面
- 關於執行緒的幾個函式執行緒函式