这两天搞了个框架,采用轮询调用dll的模式实现软件功能的模块化;但是在使用多线程显示非模态对话框的时候却不太理想。
花了半天时间找到了问题,由于多线程没有互斥,导致在new 的时候重复分配;这个问题解决之后,突然发现用的不是debug版本;于是乎修改设置进行debug,引起了一堆的问题。
问题较多,但是主要是内存泄露;内存泄露也不影响使用,因为不是循环泄露,而是资源没有释放;
既然找到了问题就解决吧,两天的磨难开始了......
释放加上了,开始出现debug断言;各种方法都没有效果,甚至包括将回调函数改为消息、重新写了一遍基础框架等;没办法只能一句一句的跟代码;
原来还是笨办法管用,很快找到了问题:调用dll内的接口函数释放dll中的非模态窗口时出现的断言错误,主要有wincore954和wincore1073这两个错误;后来还有heapfree错误;反正错误都不是提示在工程代码里。
经过各种搜索,最后定位在delete 上;缩小范围后,找到了很多解决方案,尼玛就没一个有效果的:
模态对话框与非模态对话的几种销毁方法与区别
非模态对话框的销毁
VC非模态对话框创建和销毁
统统没有效果,难道你们遇到的问题都解决了?还是你们没有用dll调用非模态窗体??
平心而论,也不是没有收获,所有人都提到:CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }
但是最最关键的问题却避而不谈,是不是想藏着掖着??没办法,只能去msdn上看看了。看msdn还是要用迭代法,先读懂每一个单词,然后再将单词
组成句子,幸好不复杂,很简单的点明了:We recommend that you call DestroyWindow to destroy a Windows object, either the C++ method or the global DestroyWindow API.
就这一句话,再加上之前的PostNcDestroy,彻底解决了问题。希望能对你有帮助。
虽然啰里啰嗦的写了一篇,关键就是两句话的事,权当我发发牢骚。
补充一点:一定是 DestroyWindow(pMyDialog),而不是pMyDialog->DestroyWindow();为啥没深究
附:https://msdn.microsoft.com/en-us/library/5zba4hah.aspx