91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

龙山县| 乐陵市| 达日县| 万全县| 台安县| 洪雅县| 万源市| 武安市| 靖西县| 吉木萨尔县| 沂南县| 神池县| 新建县| 仪陇县| 博湖县| 容城县| 普陀区| 石台县| 万州区| 哈尔滨市| 即墨市| 湘潭市| 华安县| 永川市| 花垣县| 永康市| 曲周县| 德昌县| 临沭县| 巴青县| 南木林县| 曲阜市| 齐齐哈尔市| 化德县| 铜川市| 扶余县| 黑龙江省| 长寿区| 油尖旺区| 正蓝旗| 嵊州市|