程序是单文档结构,我在主框架工具栏按钮响应函数中创建了一个线程,
想在线程中先获取文档指针,再访问一个文档类里的一个变量。
在获取文档指针时程序崩溃,提示访问违规。
我的代码是:CAotuSendDoc *mydoc = (CAotuSendDoc *)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveDocument();
那么我换一种方法,在主框架创建时就在Create函数中获取到文档指针并保存在成员变量中,
在线程调用时把主框架指针传进线程,在线程中访问成员变量--文档指针,这时语句执行没有问题,但是
执行到通过这个文档指针访问文档类中的成员变量时又崩溃了CAotuSendDoc *mydoc = m_mainh->mydoct;
int  TimeInterval = 10;
if (TimeInterval >= mydoc->RunInterval)//这句崩溃了,访问违规
{

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

解决方案 »

  1.   

    你调试发现这个mydoc是有效的吗?  或者你createthread的时候把CAotuSendDoc*当参数传进去啊
      

  2.   

    CDocument,CView等MFC类,不能在线程中直接使用指针访问的,我以前也碰到过这个问题。你好好看看线程访问MFC框架类方面的资料。
      

  3.   

    你创建线程的时候直接将doc类的成员变量的值传递给线程即可。
      

  4.   


    如何看这个指针是否有效?在主框架的Create获取后就一直存着,他的值肯定不是NULL。
    问题是我还想改变一些成员变量的值,那只能传指针,那穿指针岂不又访问不了了。
      

  5.   

    用消息可以。。难不成以后只能用消息传递吗?如果用消息传递大量数据时会不会有问题啊?在一个频繁发送消息如果消息队列满了那不就丢消息了吗?我是这么发消息的:
    在主框架中添加一个自定义消息:
    .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);但是这样有个缺点,如果消息函数处理时间太长,界面会卡死啊!
    而且消息频率过大会不会丢消息??
      

  6.   

    用大量消息传递的确会有问题,用消息传递大量数据则无所谓,传的只有一个地址而已。应该尽量避免线程之间像你这样用SendMessage互相等待。如果PostMessage能够搞定的就用PostMessage。
      

  7.   


    请教大神:
    1、下面的代码都需要消息获取来的数据,只能用SendMessage啊,用PostMessage他不等待的话下面的代码都没法用了。请问SendMessage互相等待会有什么坏处啊?
    2、在本例中,消息执行函数如果耗时很长,那界面都很卡啊,我这种情况只能用消息吗?还有其他方法可以操作文档类的成员变量吗?
      

  8.   

    互相等待很容易造成死锁。如果不等待的话下面的代码都没法用,为什么不把下面的代码搬到同一个线程去?就算是访问窗口类对象也可以传HWND的,缺乏线程安全的是MFC的封装类不是Windows的API。可以把文档类的成员变量的地址传给线程,这样多线程访问时只需对成员变量的访问加锁,不需要锁整个文档。
      

  9.   

    想想办法咯,指针反正是无效了。响应消息是好办法,并不是SendMessage的错,有些情况下还必须得用SendMessage。4楼可能是正确的解答。