文档中建立线程,并传接消息给视图.使视图更新

文档中建立线程,并传递消息给视图.使视图更新
文档线程建立
C/C++ code

void CMyDoc::OnStart()
{
    // TODO: 在此添加命令处理程序代码
    AfxBeginThread(ReceiveThread,this);

}



线程函数
C/C++ code

UINT CMyDoc::ReceiveThread(void * param)
{
         .................
         .................
    //int len=1;
    CString str;
    while(1)
    {
                  //下面是利用这个线程函数接收len 和 f        
        Sleep(1);
                  len = ,,
                  f = ..//f是数组 

    }
    return 0;
}




在View的OnDraw里
C/C++ code

void CMyView::OnDraw(CDC* /*pDC*/)
{
    CMyDoc* pDoc = GetDocument();//获取文档指针
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码

    UpdateData(true);
    ...........
         //次处加入显示len 和 f的代码
         ..........

    UpdateData(FALSE); //初始化窗口数据
    
}




请问,我该如何让CView 能够工作啊

个人认为:
1.Doc没有向View里传递更新信息,请问Doc会自动向View发送更新信息吗,不能怎样。
2.线程函数有问题,使不能传递消息。进程视图更新。
觉得1的可能性较大。

请各位大虾说说...




------解决方案--------------------
UINT CMyDoc::ReceiveThread(void * param)声明为static UINT ReceiveThread了没?

------解决方案--------------------
When a document's data changes, the view responsible for the changes typically calls the CDocument::UpdateAllViews function for the document,
你调用了没有?
------解决方案--------------------
doc/view架构的正常用法:

1、把len和f定义为Doc类的成员变量
2、Doc类修改了len和f后只需要调用UpdateAllViews
3、view类在OnDraw里用pDoc->len,pDoc->f更新界面



如果你一定要用消息机制:

1、自定义消息:const UINT WM_MYMSG=::RegisterWindowMessage("MyMsg");
2、在view类的.h文件中声明消息响应函数:afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);
3、在view类的消息列表中加入消息映射:
BEGIN_MESSAGE_MAP
...//其他消息映射
ON_REGISTERED_MESSAGE(WM_MYMSG,OnMyMsg)
END_MESSAGE_MAP()

4、当doc类更新时,调用PostMessage发送自定义消息
5、在view类的.cpp文件中实现OnMyMsg函数,在此函数中调用OnDraw


很明显。。。用消息机制是吃力不讨好。。。
如果你一定要用子线程来发消息。。。那就更麻烦了。。。

------解决方案--------------------
同意楼上的,我也感觉用线程好复杂的,从来没想过
------解决方案--------------------
接收线程用sleep是不行的,应该用事件.
------解决方案--------------------
5楼的问题,窗口应该重绘了!
------解决方案--------------------
void CMyView::OnDraw(CDC* /*pDC*/)
{
CMyDoc* pDoc = GetDocument();//获取文档指针
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码

UpdateData(true);
...........
//次处加入显示len 和 f的代码
..........
pDoc->len
pDoc->f[0]
//直接这么用就可以
//CMyDoc* pDoc = GetDocument();//获取文档指针 不是应获取到文档指针了吗



UpdateData(FALSE); //初始化窗口数据

}

------解决方案--------------------
C/C++ code


UINT CMyDoc::ReceiveThread(void * param)
{
         .................
         .................
    //int len=1;
    CString str;
    while(1)
    {
                  //下面是利用这个线程函数接收len 和 f        
        Sleep(1);
                  len = ,,
                  f = ..//f是数组 

         //加这句试试 跟新所有视图类
         POSITION pos = GetFirstViewPosition();
        while (pos != NULL)
       {
          CView* pView = GetNextView(pos);
          pView->UpdateWindow();
       }    


    }
    return 0;
}