RT:
程式后臺有一個執行緒,掃描矩陣鍵盤,并根據CWnd *dlgCurrent,發送按鍵訊息
::PostMessage(dlgCurrent->m_hwnd, ...)
在主視窗和子視窗(Menu視窗)中都定義了PreTranslateMessage訊息,
主表單初始化時dlgCurrent = this。
運行程式后,主表單可以接收相應的按鍵資訊。
在按鍵訊息中有一個是打開子表單的
case MYKEY_MENU:
CMYMenu *dlgMenu = new CMYMenu();
dlgCurrent = dlgMenu;
dlgMenu.DoModal();
dlgCurrent = this;
...
剛打開Menu視窗時,鍵盤按鍵訊息都正常。
不做任何操作,大約5分鐘左右后,Menu視窗再也接收不到任何PostMessage的訊息了。。。。
通過聯調:
后臺鍵盤掃描執行緒發送PostMessage時dlgCurrent資料正常(視窗指標什么的,都是指向Menu視窗的,前后對比);
Menu視窗正常顯示;
Menu視窗解構式增加了一段代碼及斷點,未見中斷發生;
主表單PreTranslateMessage里case MYKEY_MENU分支打開選單視窗的前后都加了斷點,未見例外退出發生。
為啥?
訊息機制崩潰了嗎?
該如何排查問題?
uj5u.com熱心網友回復:
搜“GDI泄露檢測”?uj5u.com熱心網友回復:
看看 PostMessage 是否成功?將 PostMessage 的訊息 引數 TRACE出來 觀察 引數變化
uj5u.com熱心網友回復:
把視窗句柄等也列印一下,看視窗句柄有沒有變化uj5u.com熱心網友回復:
"程式后臺有一個執行緒,掃描矩陣鍵盤"上傳代碼 ?
uj5u.com熱心網友回復:
不是GDI的問題。
1 所有的GDI有關的都在一個自定義的類里面,GetXX createXX 都有ReleaseXX DeleteXX進行對應。
2 主程式里面定時重繪界面顯示資料,在登錄后即不重繪了(甚至注釋掉),打開Menu子視窗后,什么都不操作,幾分鐘后,還是一樣的結果。
uj5u.com熱心網友回復:
鍵盤掃描時,如果沒有按鍵,我回傳了0x00,有按鍵時就回傳的按鍵值(根據行列查二維表),在按鍵釋放時
if ((byteKey == 0x00) && (bytePriorKey > 0)) //抬起,才認為完成一次按鍵
{
//根據當前的視窗定向的發送按鍵訊息
::PostMessage(dlgCurrent->m_hWnd, MYMSG_KEYDOWN, bytePriorKey, 0);
}
bytePriorKey = byteKey;
所以用的debug加斷點,看發送訊息,相關dlgCurrent的資料均正常。
PostMessage本身是否成功,倒是可以看看。
uj5u.com熱心網友回復:
句柄時正常的,沒有變。
uj5u.com熱心網友回復:
檢查是否資源泄漏的辦法之一:在任務管理器 行程 查看 選擇列 里面選擇:記憶體使用、虛擬記憶體大小、句柄數、執行緒數、USER物件、GDI物件
讓你的程式(行程)不退出,回圈執行主流程很多遍,越多越好,比如1000000次甚至無限回圈,記錄以上各數值,再隔至少一小時,越長越好,比如一個月,再記錄以上各數值。如果以上兩組數值的差較大或隨時間流逝不斷增加,則鐵定有對應資源的資源泄漏!
uj5u.com熱心網友回復:
硬體的 鍵盤 要 考慮 按鍵 抖動 。uj5u.com熱心網友回復:
1.建議多執行緒程式發送訊息的時候不要隨便使用視窗指標,然后還要里面的視窗句柄,因為這個dlgCurrent在視窗切換的時候輔助執行緒可能不知道,所以你最少做一個臨界區互斥吧2.可能你的程式在某個地方修改了指標,或者指標無效了,所以這時候可能不好除錯到例外錯誤,建議你每次PostMessage(....)時把目標視窗和句柄保存到一個Log檔案中,然后也把彈出CMYMenu視窗也做個記錄,時間最好能夠記錄到毫秒
uj5u.com熱心網友回復:
買的板子帶的Windows Embedded Compact 7里面沒有這些。。。
uj5u.com熱心網友回復:
寫一個log看看,明天去試試。
uj5u.com熱心網友回復:
防抖是考慮了的,用的延時。
uj5u.com熱心網友回復:
為什么 PostMessage 而不是 SendMessage, 進一步· 視窗 收到 Message 后 要 回復 一個 訊息,表示收到,你這樣 亂發 亂收 , 不會 掉 東西 嗎 ?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/63995.html
標籤:界面
上一篇:IOCP socket重用
