windows的ui程式都是訊息驅動的,所以出現介面卡死,思考的方向是訊息迴圈是不是能出現問題了。下面分析windows程式介面卡死的幾個可能的原因:
主線程(ui執行緒)出現死迴圈。
如果主線程出現死迴圈,那麼windows將不能從訊息佇列中取出訊息,並進行處理,所以出現卡死現象。為了驗證是這個原因導致介面卡死,開啟任務管理器,如果該程序的cpu使用率一直保持非零,比如一直保持在3%,那麼介面卡死的原因是主線程死迴圈了。
主線程和其他的執行緒由於資源或者鎖爭奪,出現了死鎖。
如果主線程由於跟其他的執行緒由於爭奪資源或者鎖,出現了死鎖,那麼主線程會一直等待資源或者鎖,導致主線程不能繼續往下執行,分發和處理訊息,所以出現卡死。這種情況下,任務管理器中這個程序的cpu使用率一般是0,也有意外是除這個執行緒外,其他的執行緒也在執行,耗費cpu。所以最好的辦法是使用偵錯程式,掛載在這個程序上,觀察這個程序的各個執行緒呼叫棧,觀察執行緒等待的資源等。
程序被除錯掛載了,偵錯程式在乙個斷點處斷下。
這種情況出現的非常少,只有在除錯乙個程式的時候才會出現。
程式有gdi物件洩漏,導致介面卡死。
對於這種情況。通過觀察任務管理器的gdi資料可以發現問題。首先任務管理器的「檢視」->「選擇列」出現如下的介面,選擇gdi物件。這樣在任務管理器中就可以看到程序的gdi物件數目了。如果gdi物件數達到千數量級,那麼很有可能是這個原因。
解決介面卡死的問題
private void textbox2 textchanged object sender,eventargs e objthread.start 新增以下 忽略控制項多執行緒的安全機制 可實現,但不建議直接建立執行緒操作控制項,控制項上的大多數方法只能從建立控制項的執行緒呼叫 control....
MFC 介面卡死到底為何
現象 程式執行一段時間後,介面卡死 程式開啟了乙個監聽執行緒 建立接收訊號線程 thread afxbeginthread getiomsgthread,this,thread priority normal,0,0,null int cfeecard multidlg maingetiomsg l...
c 介面卡死處理方法
方法一 設定屬性 control.checkforillegalcrossthreadcalls false 開啟乙個新執行緒 thread th new thread search detailid.trim th.isbackground true th.start public void se...