子线程中获取文档指针时程序崩溃!

ATMCash4423 2013-08-19 09:08:04
程序是单文档结构,我在主框架工具栏按钮响应函数中创建了一个线程,
想在线程中先获取文档指针,再访问一个文档类里的一个变量。
在获取文档指针时程序崩溃,提示访问违规。
我的代码是:

CAotuSendDoc *mydoc = (CAotuSendDoc *)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveDocument();


那么我换一种方法,在主框架创建时就在Create函数中获取到文档指针并保存在成员变量中,
在线程调用时把主框架指针传进线程,在线程中访问成员变量--文档指针,这时语句执行没有问题,但是
执行到通过这个文档指针访问文档类中的成员变量时又崩溃了。。。

CAotuSendDoc *mydoc = m_mainh->mydoct;
int TimeInterval = 10;
if (TimeInterval >= mydoc->RunInterval)//这句崩溃了,访问违规
{
。。。。。。。。。。
}

我该怎么改啊??我就想在子线程中读写文档类的一些成员变量。

...全文
195 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daisy__Ben 2013-08-27
  • 打赏
  • 举报
回复
想想办法咯,指针反正是无效了。响应消息是好办法,并不是SendMessage的错,有些情况下还必须得用SendMessage。4楼可能是正确的解答。
蒋晟 2013-08-19
  • 打赏
  • 举报
回复
用大量消息传递的确会有问题,用消息传递大量数据则无所谓,传的只有一个地址而已。应该尽量避免线程之间像你这样用SendMessage互相等待。如果PostMessage能够搞定的就用PostMessage。
ATMCash4423 2013-08-19
  • 打赏
  • 举报
回复
用消息可以。。。。。难不成以后只能用消息传递吗?如果用消息传递大量数据时会不会有问题啊?在一个频繁发送消息如果消息队列满了那不就丢消息了吗? 我是这么发消息的: 在主框架中添加一个自定义消息: .H #define WM_GetRunInterval WM_USER + 101 afx_msg LRESULT OnGetRunInterval(WPARAM wParam, LPARAM lParam); .CPP BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_MESSAGE(WM_GetRunInterval, &CMainFrame::OnGetRunInterval) END_MESSAGE_MAP() LRESULT CMainFrame::OnGetRunInterval(WPARAM wParam, LPARAM lParam) { CAotuSendDoc *MYDOC = (CAotuSendDoc *)GetActiveDocument(); *(int*)wParam = MYDOC->RunInterval; return true; } 在线程中调用: int datt = 0; 事先保存的主框架this指针.SendMessage(WM_GetRunInterval, (WPARAM)&datt); 但是这样有个缺点,如果消息函数处理时间太长,界面会卡死啊! 而且消息频率过大会不会丢消息??
ATMCash4423 2013-08-19
  • 打赏
  • 举报
回复
引用 1 楼 yaozhiyong110 的回复:
你调试发现这个mydoc是有效的吗? 或者你createthread的时候把CAotuSendDoc*当参数传进去啊
如何看这个指针是否有效?在主框架的Create获取后就一直存着,他的值肯定不是NULL。
引用 4 楼 VisualEleven 的回复:
你创建线程的时候直接将doc类的成员变量的值传递给线程即可。
问题是我还想改变一些成员变量的值,那只能传指针,那穿指针岂不又访问不了了。。。。
蒋晟 2013-08-19
  • 打赏
  • 举报
回复
互相等待很容易造成死锁。如果不等待的话下面的代码都没法用,为什么不把下面的代码搬到同一个线程去?就算是访问窗口类对象也可以传HWND的,缺乏线程安全的是MFC的封装类不是Windows的API。 可以把文档类的成员变量的地址传给线程,这样多线程访问时只需对成员变量的访问加锁,不需要锁整个文档。
Eleven 2013-08-19
  • 打赏
  • 举报
回复
你创建线程的时候直接将doc类的成员变量的值传递给线程即可。
牛魔皇 2013-08-19
  • 打赏
  • 举报
回复
CDocument,CView等MFC类,不能在线程中直接使用指针访问的,我以前也碰到过这个问题。你好好看看线程访问MFC框架类方面的资料。
ouyh12345 2013-08-19
  • 打赏
  • 举报
回复
我就想在子线程中读写文档类的一些成员变量。 在线程里,最好不要直接访问访问成员变量,用类函数或发消息
yaozhiyong110 2013-08-19
  • 打赏
  • 举报
回复
你调试发现这个mydoc是有效的吗? 或者你createthread的时候把CAotuSendDoc*当参数传进去啊
ATMCash4423 2013-08-19
  • 打赏
  • 举报
回复
引用 7 楼 jiangsheng 的回复:
用大量消息传递的确会有问题,用消息传递大量数据则无所谓,传的只有一个地址而已。应该尽量避免线程之间像你这样用SendMessage互相等待。如果PostMessage能够搞定的就用PostMessage。
请教大神: 1、下面的代码都需要消息获取来的数据,只能用SendMessage啊,用PostMessage他不等待的话下面的代码都没法用了。请问SendMessage互相等待会有什么坏处啊? 2、在本例中,消息执行函数如果耗时很长,那界面都很卡啊,我这种情况只能用消息吗?还有其他方法可以操作文档类的成员变量吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧