文档中建立线程,并传送消息给视图.使视图更新
文档中建立线程,并传递消息给视图.使视图更新
文档线程建立
线程函数
在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: 在此处为本机数据添加绘制代码
文档线程建立
void CMyDoc::OnStart()
{
// TODO: 在此添加命令处理程序代码
AfxBeginThread(ReceiveThread,this);
}
线程函数
UINT CMyDoc::ReceiveThread(void * param)
{
.................
.................
//int len=1;
CString str;
while(1)
{
//下面是利用这个线程函数接收len 和 f
Sleep(1);
len = ,,
f = ..//f是数组
}
return 0;
}
在View的OnDraw里
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: 在此处为本机数据添加绘制代码