hur.cn - 华软网

 热门搜索

线程A结束线程B时出现资源冲突的问题

  作者:未知    来源:网络    更新时间:2011/5/25
MFC Socket编程中,程序A的OnReceive函数用来与收发网络上的消息,并且会用到Doc类的一个CString成员变量。在程序A运行的过程中,同一台机器上的程序B通过 WM_COPYDATA 消息向程序A发送一个关闭的信号;程序A在 CMainFram 中接收该消息,并PostMessage(WM_CLOSE)。此时,程序报错。提示函数 OnReceive 在使用Doc类的CString成员变量时出错,调试发现该CString变量显示为“错误的指针”。

我分析是,主线程结束时释放了Doc对象中CString成员变量的空间(但此时Doc指针并不为空),导致收发消息的线程使用该变量时出错。

1)不知道我分析的对不对?
2)如果我的猜测是正确的,那该如何解决这个问题?
3)我所能想到的解决思路之一:能否在使用这个CString变量前,判断该变量是否有效(即变量空间是否已被释放),从而解决这个问题?但CString类中貌似没有此类的函数。这又该怎么办呢?
4)我所能想到的解决思路之二:在 PostMessage(WM_CLOSE)之前,结束掉收发子线程。但如何结束掉这个子线程呢?

问题比较多,但都是从一个错误引发出来的,其中夹杂了一些我的思路和想法,不一定对,希望对解决问题能有帮助!
---华软 网友回答---
4)我所能想到的解决思路之二:在 PostMessage(WM_CLOSE)之前,结束掉收发子线程。


你自己创建的线程,还没法结束掉么...
---华软网友回复---
引用 1 楼 kyotrue 的回复:
4)我所能想到的解决思路之二:在 PostMessage(WM_CLOSE)之前,结束掉收发子线程。


你自己创建的线程,还没法结束掉么...

这个线程是侦听线程,不是用 AfxBeginThread 起来的
---华软网友回复---
貌似侦听线程也要自己创建吧...
---华软网友回复---
引用 3 楼 kyotrue 的回复:
貌似侦听线程也要自己创建吧...

不是吧。侦听线程时系统自建的吧。

在工程里新建一个CSocket的派生类CMySocket,重载OnReceive;然后在主线程里实例化CMySocket。如果程序收到Socket消息,那么它就会自动调用Onreceive。

这个过程是不用程序员实现的。
---华软网友回复---
原来你用的的CSocket。。。直接调用它的Close不行么?
---华软网友回复---
引用 5 楼 kyotrue 的回复:
原来你用的的CSocket。。。直接调用它的Close不行么?

直接调用close是可以关闭socket,但是在关闭之前,OnReceive还是会用到那个CString变量。所以冲突依旧在。
---华软网友回复---
为什么这个信号用CString类呢? 有必要吗?      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。