MFC 文档与视图的数据交互问题-工作线程的困惑

独上西楼 2013-03-03 08:51:24
大家好,小弟这里有个问题
//doc.h
class CMyDoc:public CDocument
{
CArray<CPoint,CPoint> m_ptArray;
}
//doc.cpp
void CMyDoc::OnStart()
{
AfxBeginThread(WorkThread,(LPVOID)this);
}

UINT WorkThread(LPVOID pParam)
{
CMyDoc *pDoc = (CMyDoc *)pParam;
int nCount =0;
while(nCount < MAX)//读取MAX个图片,处理结果(图像的中心点坐标)存放在data中。
{
pDoc->OnOpenDocument(filename);
Process(*data);
pDoc->m_ptArray.Add(pData);
pDoc->UpDateAllViews(NULL);
nCount++;
}
return 0;
}
//view.cpp
void MyView::DrawData(CDC*pDC)
{
CMyDoc *pDoc = GetDocument();
int x1,y1,x2,y2;
for(k=1;k<MAX;k++)
{
x1 = pDoc->m_ptArray.GetAt(k-1).x;
y1 = pDoc->m_ptArray.GetAt(k-1).y;
x2 = pDoc->m_ptArray.GetAt(k).x;
y2 = pDoc->m_ptArray.GetAt(k).y;
pDC->MoveTo(x1,y1);
pDC->LineTo(x2,y2);
}
}

void CMyView::OnDraw(CDC*pDC)
{
DrawData(pDC);
}

这个程序Release版本可以运行,但是Debug版本运行时出错,请问如何解决呢?翻阅很多帖子,都没给出合理的解决方法。请大侠们不吝赐教,造福后辈!感激涕零!
...全文
750 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuankuan_qiao 2014-01-03
  • 打赏
  • 举报
回复
你的问题解决了没有啊
这个娜戒海了 2013-03-13
  • 打赏
  • 举报
回复
引用 10 楼 VisualEleven 的回复:
引用 4 楼 louisejackie 的回复:引用 2 楼 jason_wentzel 的回复: 线程中是不能对界面进行操作的,是不安全的,改成PostMessage,然后由主线程操作 引用 3 楼 GLSC_CENA 的回复: 这个不同步吧,线程不要对主界面进行绘制操作,必须有问题 发消息的话不是响应速度很慢吗?另外,专家们都说程序中尽量不要使用全局变……
他不想在Doc加上View的头文件,你觉得这样可行么?
这个娜戒海了 2013-03-13
  • 打赏
  • 举报
回复
引用 11 楼 louisejackie 的回复:
引用 9 楼 GLSC_CENA 的回复:能不能把这个读取的线程写到view里面,为何一定要写到Doc里面 或者你在DOC里面设置一个变量VIEW,用界面的VIEW来对它进行赋值,然后你到线程里面调用pDoc.m_View就可以找到那个view的地址了哇 好久没上了,才看到你的回复,呵呵,希望不太晚 Doc里面设置View?这样要包含View的头文件吧。之所以把读取……
你的意思是Doc里面不能包含View的头文件??
Eleven 2013-03-12
  • 打赏
  • 举报
回复
引用 4 楼 louisejackie 的回复:
引用 2 楼 jason_wentzel 的回复: 线程中是不能对界面进行操作的,是不安全的,改成PostMessage,然后由主线程操作 引用 3 楼 GLSC_CENA 的回复: 这个不同步吧,线程不要对主界面进行绘制操作,必须有问题 发消息的话不是响应速度很慢吗?另外,专家们都说程序中尽量不要使用全局变量,但是我在Doc里面的线程如何接收到View的窗口句柄呢?多谢楼上两位施……
创建线程的时候不是有个参数吗?参数传递什么都可以,只要参数有效。比如你可以把View类的HWND窗口句柄传递过去。
这个娜戒海了 2013-03-12
  • 打赏
  • 举报
回复
能不能把这个读取的线程写到view里面,为何一定要写到Doc里面 或者你在DOC里面设置一个变量VIEW,用界面的VIEW来对它进行赋值,然后你到线程里面调用pDoc.m_View就可以找到那个view的地址了哇 好久没上了,才看到你的回复,呵呵,希望不太晚
请叫我涛哥0-0 2013-03-12
  • 打赏
  • 举报
回复
你的程序应该是不同步的,有问题。View和新创建的Thread都在访问m_ptArray,这需要内核对象去保护。 另外,要去通知View可以发送自定义消息,也可以在MainFrame中设置成员变量(标志是否数据更新了)。 最后,你的UpDateAllViews调用位置有问题,因为你没有对m_ptArray加互斥锁。
独上西楼 2013-03-12
  • 打赏
  • 举报
回复
引用 9 楼 GLSC_CENA 的回复:
能不能把这个读取的线程写到view里面,为何一定要写到Doc里面 或者你在DOC里面设置一个变量VIEW,用界面的VIEW来对它进行赋值,然后你到线程里面调用pDoc.m_View就可以找到那个view的地址了哇 好久没上了,才看到你的回复,呵呵,希望不太晚
Doc里面设置View?这样要包含View的头文件吧。之所以把读取写到Doc里面,是为了实现数据和显示的分离。不让我就把这个线程放到View里面了啊。其实这是一类问题,我想知道各位同仁是怎么处理的,所以没有简单的放在View里面来解决问题,还恳请您理解~~
独上西楼 2013-03-11
  • 打赏
  • 举报
回复
还有人要补充吗?很着急啊这个问题
向立天 2013-03-08
  • 打赏
  • 举报
回复
引用 4 楼 louisejackie 的回复:
引用 2 楼 jason_wentzel 的回复:线程中是不能对界面进行操作的,是不安全的,改成PostMessage,然后由主线程操作 引用 3 楼 GLSC_CENA 的回复:这个不同步吧,线程不要对主界面进行绘制操作,必须有问题 发消息的话不是响应速度很慢吗?另外,专家们都说程序中尽量不要使用全局变量,但是我在Doc里面的线程如何接收到View的窗口句柄……
谁告诉你发消息回影响速度的 你试过么 句柄是可以通过消息参数传递的
昨夜无风 2013-03-08
  • 打赏
  • 举报
回复
pDoc->UpDateAllViews(NULL);要放在while外面吧。 你读一个UpDateAllViews一次,但是你的view中又是用的for(k=1;k<MAX;k++)
独上西楼 2013-03-08
  • 打赏
  • 举报
回复
引用 2 楼 jason_wentzel 的回复:
线程中是不能对界面进行操作的,是不安全的,改成PostMessage,然后由主线程操作
引用 3 楼 GLSC_CENA 的回复:
这个不同步吧,线程不要对主界面进行绘制操作,必须有问题
发消息的话不是响应速度很慢吗?另外,专家们都说程序中尽量不要使用全局变量,但是我在Doc里面的线程如何接收到View的窗口句柄呢?多谢楼上两位施主回复!
独上西楼 2013-03-08
  • 打赏
  • 举报
回复
工作线程在Doc,处理Doc中的数据,然后更新视图显示处理结果。问题是,线程函数要调用Doc成员函数来打开文件,这样的话必须传递this指针。这样的话还如何接收View句柄来从而向View发送消息来更新视图呢 void MyDoc::OnStartProcess() { AfxBeginThread(WorkThread,(LPVOID),this) } UINT WorkThread(LPVOID pParam) { CMyDoc *pDoc = (CMyDoc*)pParam; filename = pDoc->GetFileName(); pDoc->OnOpenDocument(filename); ::SendMessage(h_Wnd,...);//这个View的句柄如何传递? }
这个娜戒海了 2013-03-04
  • 打赏
  • 举报
回复
这个不同步吧,线程不要对主界面进行绘制操作,必须有问题
孤客天涯 2013-03-04
  • 打赏
  • 举报
回复
线程中是不能对界面进行操作的,是不安全的,改成PostMessage,然后由主线程操作
独上西楼 2013-03-03
  • 打赏
  • 举报
回复
如果不在线程中使用UpDateAllViews(NULL),那就需要使用自定义消息,但是这样的话就会有影响处理速度吧!我希望线程函数能尽快的处理一副图像。

15,471

社区成员

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

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