中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

wxWidgets第十六課 wxTimer沒有調用stop導致崩潰的問題分析

發布時間:2020-08-01 00:15:43 來源:網絡 閱讀:1027 作者:fengyuzaitu 欄目:系統運維

場景

   調用wxTimer定時器功能的時候,如果關閉當前的窗口,會出現上述的問題:0xC0000005: 讀取位置 0xFEEEFF06 時發生訪問沖突

說明

    跟蹤調用堆棧的具體情況,代碼崩潰點指向IMPLEMENT_APP(CTestApp)

調用堆棧指向:

  wxEntry(int &,wchar_t * *) 未知

  wxEntry(struct HINSTANCE__ *,struct HINSTANCE__ *,char *,int) 未知

> WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) 行 4 C++

        __tmainCRTStartup() 行 528 C


經驗

如果只是根據這些信息,顯然沒有任何的實際意義,從而引出下文的重點:當出現程序崩潰的時候,需要從當前的堆棧信息,不斷的從最新的函數調用往前進行回溯,指向WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) 行 4 C++這一句的指針式白色的,而在調用堆棧的列表上,還有其他的信息,尤其是最前面的×××的指針指向的內容:wxEvtHandler::SafelyProcessEvent(class wxEvent &)未知,經過不斷的回溯,才知道是wxTimerImpl發生錯誤,明顯的這是一個定時器,而在程序中確實使用了定時器,現在已經鎖定了目標,分析問題就不會太難了。之前沒有分析出問題,就是沒有逐一分析調用堆棧,看不懂系統調用沒有關系,關鍵是哪些用戶的調用會觸發系統的調用從而導致問題的出現


跟蹤調用堆棧

  wxEvtHandler::SafelyProcessEvent(class wxEvent &)未知

  wxTimerImpl::SendEvent(void)未知

  wxTimerWndProc(struct HWND__ *,unsigned int,unsigned int,long)未知


說明在定時器處理消息的時候出現了問題,此時關閉窗口,應該已經銷毀了定時器的實例指針,這個時候定時器應該接收不到任何的消息,但是從調用堆棧來看,定時器內部還是繼續在處理消息,導致了問題的出現


查看代碼

    聲明:wxTimer *m_timer;

    創建對象:m_timer = new wxTimer(this, TIMER_ID);

    啟動定時器:m_timer->Start(10);


結論

這里就有一個問題了,沒有停止定時器,但是就算沒有停止,發生的最終原因又是為何?當然了,通過在關閉窗口之前,調用m_timer->Stop(),停止定時器,解決了該問題


擴展

class WXDLLIMPEXP_BASE wxTimer : public wxEvtHandler


class WXDLLIMPEXP_BASE wxEvtHandler : public wxObject

                                    , public wxTrackable

從上面看到定時器的繼承關系


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大方县| 上蔡县| 宿迁市| 同心县| 呼和浩特市| 庆元县| 海宁市| 和平县| 法库县| 芒康县| 绩溪县| 沙坪坝区| 新密市| 油尖旺区| 阿坝县| 大庆市| 大埔县| 尼玛县| 灵武市| 漳州市| 通化县| 长乐市| 绍兴县| 柳林县| 砀山县| 黑龙江省| 舞钢市| 如皋市| 龙南县| 鸡西市| 石林| 石屏县| 惠州市| 滨海县| 天水市| 康保县| 简阳市| 富锦市| 五指山市| 新干县| 聂拉木县|