文档中建立线程,并传接消息给视图.使视图更新
文档中建立线程,并传递消息给视图.使视图更新
文档线程建立
线程函数
在View的OnDraw里
请问,我该如何让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
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; }