当前位置:C++技术网 > 资讯 > 线程在对话框销毁之后访问对话框的句柄的问题

线程在对话框销毁之后访问对话框的句柄的问题

更新时间:2016-08-11 14:04:46浏览次数:1+次

在调试程序的时候,程序崩溃了,根据堆栈定位到了这个线程中,发现是因为对话框销毁之后线程仍去访问对话框的句柄,即图中的pDlg->GetSafeHwnd(),此时的pDlg值为0xfeefee,请问这个要怎么修改才能正确的在销毁对话框的同时销毁线程呢,因为刚接触线程没多久,希望能把原理简单介绍下,顺便推荐几本经典的书呗

【提醒】网站提供了在线提问,请在在线提问里提交问题。在发布文章那里提问的问题,不容易操作回答,不好维护。后续会关闭这个发布文章的提问接口,全面使用在线提问提问。而且对于发布文章提问的提问不做解答。请习惯用在线提问。
推荐学习的书:《Windows核心编程》。

    线程的使用就和main函数一样,没有什么特别的。多个线程就好像多个main同时在执行。因为多个线程在同一个进程中,所以进程中的资源这些线程都可以访问。对于现在遇到的问题,就是多个线程同时访问对话框,然后一个线程中销毁了对话框,另一个线程却不知道被销毁了,还去访问,所以造成了错误。这样的问题就是多线程同步问题,在核心编程书中有详细讲解。多个线程公共操作的资源是临界资源,需要用锁保护起来。在使用前,需要先检测锁的状态,如果资源还存在,而且没有被占用,就可以继续使用,否则无法使用。你这里至少要对对话框指针做处理。销毁对话框后,让对话框指针置空,在使用对话框前,要检测指针是否为空,来判断对话框是否被销毁了。如果两个线程可以随意操作对话框指针的话,就要加锁。一个线程销毁对话框的时候随后要将指针设置为NULL,这个过程不能被打断。如果销毁对话框后来不及设置指针就切换到其他线程执行,此时指针的值不为NULL,对话框却被销毁了,这样就出现你遇到的问题了。更多多线程的问题,看核心编程,不是一两句说的清楚的。