关于UpdateData的奇怪问题
我有一个CMyView,其中含有一个有关串口通讯的类CMyCom,还有一个dlg
我create了dlg,然后把dlg的指针传给了CMyCom的东东。
我的MyCom响应串口事件,如果有收到字符,那么调用p_dlg->AddChar(ch)
AddChar是dlg的一个成员,在view中调用没有问题。
AddChar(char ch){
UpdateData(true);
m_str += ch;
UpdateData(false);
}
奇怪的是,我的MyCom里面调用p_dlg->AddChar(ch)运行到UpdateData(true);就报错!非常不解
怎么解决呀~谢谢
问题点数:100、回复次数:6Top
1 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2003-12-04 18:54:14 得分 10
檢查你的p_dlg是否是空的....Top
2 楼alphapiao(奉旨灌水钦差)回复于 2003-12-04 18:55:55 得分 10
m_str是不是还没有初始化Top
3 楼flyelf(空谷清音)回复于 2003-12-04 18:56:43 得分 30
用消息的方式吧,在MyCom中给p_dlg发送消息,让对话框的消息响应中进行updatedata()Top
4 楼zeroxy(水蓝)回复于 2003-12-04 19:07:44 得分 50
我猜想是因为你是使用异步方式进行通信,所以串口的接收与主线程是两个线程,而Dlg不是线程安全的所以无法对主线程的界面进行更新,经验告诉我你这样做是不规范的。
我建议你在收到字符后保存到一个变量中,然后使用窗口消息通知dlg更新。
如果只是一个字符的话,可以在消息参数中一起传过去
也就是说在收到字符后。
SendMessage(p_dlg->GetSafeHwnd(),WM_USER_ADDCHAR,(WPARAM)ch,0),Top
5 楼simonchenxu(天乱博远)回复于 2003-12-04 19:19:48 得分 0
解决了,用的是消息方式,其实我也想到了
只是不明白突然UpdateData不能用了Top
6 楼checkyvc6(已所不欲,勿施于人)回复于 2003-12-04 19:31:16 得分 0
典型的线程不安全例子!
看看窗口类指针和窗口句柄的映射关系就知道了,指针和窗口句柄的映射关系保存在一个哈西表中,而这个哈西表只是当前线程有效.故如果在其他线程里面访问的话,通过调用
afxMapHWND()函数是得不到这个表的指针的。Top




