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

sofa120 2009-07-14 05:43:54
文档线程建立

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的可能性较大。

请各位大虾说说...


...全文
140 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
南京搬运工 2012-10-17
  • 打赏
  • 举报
回复
我也碰到,好像跟对话框中类似,POSTMESSAGE
Ghost90 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 sofa120 的回复:]
引用 22 楼 Ghost90 的回复:
引用 19 楼 sofa120 的回复:
引用 17 楼 sofa120 的回复:
引用 16 楼 Ghost90 的回复:

pos = 0 是获取View类的指针失败,原因可能是View类没被建立或已经被销毁
在线程函数里用 pDoc->GetFirstViewPosition 得确保View类已经被建立




程序在运行到线程函数的时候都没到View的析构函数,这个应该表示View没有给销毁吧。不明白
[/Quote]

应该是
sofa120 2009-07-14
  • 打赏
  • 举报
回复
郁闷啊,我的机器老是要删COOKIES,不然回复后就一直跳转。。。。。。拼命刷新,直到我删除,,,,,,

是不是中毒了啊,查又查不出。。。。。。。。。。。。。。。。。。。。
sofa120 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 mmxqq 的回复:]
引用 18 楼 sofa120 的回复:
引用 17 楼 sofa120 的回复:
引用 16 楼 Ghost90 的回复:
error C2352: 'CDocument::GetFirstViewPosition' : illegal call of non-s…


知道为什么了。。。

\\

楼主,请教个问题,这个错误如何改呀?
[/Quote]

pDoc->GetFirstViewPosition()
sofa120 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 Ghost90 的回复:]
引用 19 楼 sofa120 的回复:
引用 17 楼 sofa120 的回复:
引用 16 楼 Ghost90 的回复:

pos = 0 是获取View类的指针失败,原因可能是View类没被建立或已经被销毁
在线程函数里用 pDoc->GetFirstViewPosition 得确保View类已经被建立

[/Quote]

程序在运行到线程函数的时候都没到View的析构函数,这个应该表示View没有给销毁吧。不明白
mmxqq 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sofa120 的回复:]
引用 17 楼 sofa120 的回复:
引用 16 楼 Ghost90 的回复:
error C2352: 'CDocument::GetFirstViewPosition' : illegal call of non-s…



知道为什么了。。。
[/Quote]\\

楼主,请教个问题,这个错误如何改呀?
Ghost90 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sofa120 的回复:]
引用 17 楼 sofa120 的回复:
引用 16 楼 Ghost90 的回复:

POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
.pDoc->UpdateAllViews(pView );
}



我的程序中POSITION pos = pDoc->GetFirstViewPosition();

pos = 0;请问是为什么。希望Ghost90能够回答。谢谢
[/Quote]

pos = 0 是获取View类的指针失败,原因可能是View类没被建立或已经被销毁
在线程函数里用 pDoc->GetFirstViewPosition 得确保View类已经被建立


sofa120 2009-07-14
  • 打赏
  • 举报
回复
建议都不错的。。。太感谢各位了。。。


明天结帖.......................


来者有份............
dengxuxing 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 liuchaotao 的回复:]
用消息传递,在VIEW中接收消息,并在消息处理函数中加入Invalidate().而在OnDraw中直接用相应的变量画图
[/Quote]

同意!
liuchaotao 2009-07-14
  • 打赏
  • 举报
回复
用消息传递,在VIEW中接收消息,并在消息处理函数中加入Invalidate().而在OnDraw中直接用相应的变量画图
sofa120 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sofa120 的回复:]
引用 16 楼 Ghost90 的回复:

POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
.pDoc->UpdateAllViews(pView );
}
[/Quote]

我的程序中POSITION pos = pDoc->GetFirstViewPosition();

pos = 0;请问是为什么。希望Ghost90能够回答。谢谢
sofa120 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sofa120 的回复:]
引用 16 楼 Ghost90 的回复:
error C2352: 'CDocument::GetFirstViewPosition' : illegal call of non-s…
[/Quote]

知道为什么了。。。
sofa120 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 Ghost90 的回复:]

也是这么改

POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
.pDoc->UpdateAllViews(pView );
}

[/Quote]

//#########################################################################################
error C2352: 'CDocument::GetFirstViewPosition' : illegal call of non-static member function

POSITION 这个东西没弄过,出现这个错误。。。
Ghost90 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sofa120 的回复:]
看下面:

C/C++ code
线程函数

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

//####################################################…
[/Quote]

也是这么改

POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
.pDoc->UpdateAllViews(pView );
}
Ghost90 2009-07-14
  • 打赏
  • 举报
回复


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;
}




sofa120 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fandh 的回复:]
5楼的问题,窗口应该重绘了!
[/Quote]

调试过程中,没发现重绘了。。。。
Ghost90 2009-07-14
  • 打赏
  • 举报
回复
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); //初始化窗口数据

}
fandh 2009-07-14
  • 打赏
  • 举报
回复
5楼的问题,窗口应该重绘了!
sofa120 2009-07-14
  • 打赏
  • 举报
回复
请问我在5楼的问题,不知道大家有什么看法呢
pady_pady 2009-07-14
  • 打赏
  • 举报
回复
接收线程用sleep是不行的,应该用事件.
加载更多回复(15)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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