博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wxWidgets第十六课 wxTimer没有调用stop导致崩溃的问题分析
阅读量:7124 次
发布时间:2019-06-28

本文共 1432 字,大约阅读时间需要 4 分钟。

场景

   调用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

从上面看到定时器的继承关系

     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1955428,如需转载请自行联系原作者
你可能感兴趣的文章
mysql数据库备份与恢复
查看>>
Linux下文件描述符
查看>>
单元测试系列之5:使用unitils测试Service层
查看>>
忘记了root密码不能进入系统 -红帽官方文档
查看>>
构建FTP服务器,基于SSL,基于虚拟用户
查看>>
iOS tableView类似电话薄右边的索引搜索
查看>>
metasploit 配置 on kali 2016.2
查看>>
shell正则提取字符串中的数字并保存到变量中
查看>>
我的友情链接
查看>>
编程实现sharepoint工作流中的发送邮件功能
查看>>
git命令简易使用
查看>>
时间戳
查看>>
每行 标题 与 input 都对齐
查看>>
Linux添加永久静态路由的方法
查看>>
我的友情链接
查看>>
Zookeeper安装(LINUX环境)(一)
查看>>
NFS
查看>>
PorterDuffXfermode的用法
查看>>
gitlab邮件服务器配置
查看>>
电脑共享不了
查看>>