還是老師的那個專案,以前由於計算量太大,導致程式經常出現假死的現象,因為程式只有乙個執行緒,該執行緒主要用於處理計算上了,而對於訊息佇列的響應被忽略了。因此解決的辦法就是用兩個執行緒,乙個執行緒用於計算,乙個執行緒用於處理訊息。
到網上找了一些資料,發現在mfc中把執行緒分為兩類,一類為介面執行緒,一類為工作執行緒。兩者的區別在於前都能夠處理訊息響應,而後者則不能。對於該專案來說,只要把計算的過程放到乙個工作執行緒裡來進行就可以了。
現在先試一下,我新建了乙個對話方塊,上面新增兩個按鈕,乙個是start 乙個是dialog。前者用於開始計算,而後者則彈出乙個訊息框。然後向該對話方塊裡面新增乙個死迴圈的函式
uint cmultithreaddlg::jisuan(lpvoid lpparam)
return 0;
}然後在start按鈕的響應函式上新增上jisuan(null);即可,現在執行程式,按下start按鈕後,可以看到cpu使用率漲到了100%,這個時候再按dialog按鈕無反應,拖動關閉視窗均無效。這就是前面提到的假死現象(實際上是真死,因為死迴圈了,如果不是死迴圈,而只是計算量太大才是假死)。
其實上面的那個afxbeginthread,除前面兩個引數外,後面的都是預設引數,可以省略。而必須有的這兩個引數,乙個是執行緒函式的指標,乙個是傳遞給這個函式的引數。實際中我們經常這樣用 afxbeginthread(threadproc,this);//把this傳過去,就可以呼叫類的成員了. 這樣執行緒函式就可以使用和操作類的成員了。千萬要注意執行緒函式是靜態類函式成員。
執行緒是建立了,但是如果中途要暫停該怎麼做呢?
我們在建立執行緒的時候獲得了乙個cwinthread的指標,這是乙個指向執行緒物件的指標,cwinthread類裡面就有暫停與恢復的函式,下面我就演示一下。
在原來的程式上進行改動。向對話方塊類裡面新增乙個cwinthread* 的成員變數,不用初始化為null,這樣會報錯的,因為它只能通過afxbeginthread函式獲得。把start裡面的宣告去掉。
然後新增乙個 pause 按鈕向其響應函式裡面新增** mythread->suspendthread(); 再新增乙個 resume按鈕,向其響應函式裡面新增 mythread->resumethread();
再執行程式,我們start之後,按下pause可以看到cpu恢復正常,然後resume,cpu又漲上去了,到此證明一切操作正常。
多執行緒MFC
csemaphore semaphorewrite 2,2 資源最多訪問執行緒2個,當前可訪問執行緒數2個 cwinthread pwritea afxbeginthread writea,m ctrla,thread priority normal,0,create suspended pwrit...
MFC多執行緒
如果使用者的應用程式需要有多個任務同時進行相應的處理,則使用多執行緒是較理想的選擇。多執行緒對於網路,列印,字處理,圖形影象,動畫和檔案管理的同乙個系統下執行來說,是非常必要的。在乙個多執行緒程式中,程序必須有乙個主線程,主線程可以在任何需要的時候建立新的執行緒。所有活動的縣城共享程序的資源。解決多...
MFC多執行緒
例項一參考資料 uint threadfun lpvoid pparam afxbeginthread threadfun,null 這就是建立乙個執行緒並執行了,呼叫上面的函式彈出乙個對話方塊.void cmultithread7dlg onsum cwinthread afxbeginthrea...