MFC对话框假死,求单线程解决方案,求助各位大神

AgentNeo 2012-07-18 10:46:51
有个程序,需要执行数千次循环,而且每次循环都要处理大量的读数据和筛选数据,因此比较消耗CPU和内存。
在程序运行过程中,一旦做其他的任何操作,如按键盘,或者鼠标单击或试图拖动对话框到任何地方,该程序就会假死,对话框除了标题栏外就白屏了。
而程序运行结束后,假死状态也就恢复正常了。

for(int i=0;i<CNCdata2.lnum;i++)
{


pDC->MoveTo((int)(rect.right/2-CNCdata1[i].X),(int)(rect.bottom/2-CNCdata1[i].Y));
int i1=i+1;
pDC->LineTo((int)(rect.right/2-CNCdata1[i1].X),(int)(rect.bottom/2-CNCdata1[i1].Y));
Sleep(30);

UpdateWindow();}


循环过程中添加PeekMessage()函数来处理消息:
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}

也不能解决 循环就卡住不动了,页面也卡了,求助各位大神
...全文
615 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
AgentNeo 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

引用 20 楼 的回复:

MSG msg;
while(::PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&amp;msg);
::DispatchMessage(&amp;msg);
}
//
UpdateData(TRUE);// 得到 checkbox 新状……
[/Quote]

我知道了 是因为我把这个写在定时器中了。
AgentNeo 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
//
UpdateData(TRUE);// 得到 checkbox 新状态
if(checkbox=……
[/Quote]


这样确实可以更新对话框暂停画图,但还是那个问题,
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
这段代码让循环在i=0和i=1之间来回循环 而不能向下继续+1,请教该怎么办
schlafenhamster 2012-07-19
  • 打赏
  • 举报
回复
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
//
UpdateData(TRUE);// 得到 checkbox 新状态
if(checkbox==1)break;


AgentNeo 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

onbtnrun里,
if(checkbox==1)
{
执行循环:画图
}
else{加工};

问题在于:
执行循环:画图
不知道checkbox==1,何以退出?
PeekMessage后要检测checkbox==1?
你的逻辑好像有问题!
[/Quote]

请教如何检测出checkbox!=1,
循环过程中这样添加PeekMessage()函数来处理消息:
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}

也不能解决 循环就卡在i=1处了,有什么办法,换其他控件能实现这个开始停止画图的功能么


schlafenhamster 2012-07-19
  • 打赏
  • 举报
回复
onbtnrun里,
if(checkbox==1)
{
执行循环:画图
}
else{加工};

问题在于:
执行循环:画图
不知道checkbox==1,何以退出?
PeekMessage后要检测checkbox==1?
你的逻辑好像有问题!
schlafenhamster 2012-07-19
  • 打赏
  • 举报
回复
i=xxxx;
while(i>1)
{
MSG msg;
while(::PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&amp;msg);
::DispatchMessage(&amp;msg);
}
//
UpdateData(TRUE);// 得到 checkbox 新状……
if(checkbox ==1)
{
i--;
draw()
}
else
{
continue
}

}
AgentNeo 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
//
UpdateData(TRUE);// 得到 checkbox 新状态
if(checkbox=……
[/Quote]

请教我该怎么设置i和i1实现再按下checkbox时能继续原来的画图呢?
chen_freecom 2012-07-18
  • 打赏
  • 举报
回复
可以弄一个共享DC(全局或static),开个线程画图。主线程双缓冲贴图就可以了
xiaopan 2012-07-18
  • 打赏
  • 举报
回复
数据处理线程和界面主线程分开处理即可
ouyh12345 2012-07-18
  • 打赏
  • 举报
回复
要画图啊
先把图画出来,在帖到界面上,当然得另开线程
AgentNeo 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

"开始循环后再按checkbox"
1.你的代码放哪里?
2。没有 PeekMessage,能按checkbox吗?有响应?
[/Quote]
checkbox复选框相关变量checkbox
放在另外一个加工按钮 onbtnrun里,if(checkbox==1)
{
执行循环:画图
}

else{加工};
schlafenhamster 2012-07-18
  • 打赏
  • 举报
回复
"开始循环后再按checkbox"
1.你的代码放哪里?
2。没有 PeekMessage,能按checkbox吗?有响应?
AgentNeo 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

数据处理线程和界面主线程分开处理即可
[/Quote]
全部代码是这样,画图同时实现列表框滚动,现在都能实现,就是暂停不了,只能等循环结束

for(int i=0;i<CNCdata2.lnum;i++)
{

// Select the item in the list box.
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST);
int nCount ;
pListBox->SetCurSel(i-1);



m_layer=CNCdata1[i].Layer;

UpdateData(false);
UpdateWindow();

pDC->MoveTo((int)(rect.right/2-CNCdata1[i].X),(int)(rect.bottom/2-CNCdata1[i].Y));
int i1=i+1;
pDC->LineTo((int)(rect.right/2-CNCdata1[i1].X),(int)(rect.bottom/2-CNCdata1[i1].Y));
Sleep(30);

UpdateWindow();
}
我想用一个复选框控制checkbox==1时循环,checkbox!=1停止循环,现在开始循环后再按checkbox取消时就会卡死

是不是单线程解决不了啊?我是菜鸟,没学过多线程啊,若是在开个线程该怎么开呢,能否给个代码啊?
AgentNeo 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

checkbox是什么?
[/Quote]


是一个复选框
schlafenhamster 2012-07-18
  • 打赏
  • 举报
回复
checkbox是什么?
AgentNeo 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
NULL改this
[/Quote]


试过了,也是卡在i=1那。我是用一个checkbox==1时循环,checkbox!=1不循环,现在开始循环后再按checkbox时就会卡死
schlafenhamster 2012-07-18
  • 打赏
  • 举报
回复
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
NULL改this
AgentNeo 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

PM_REMOVE 还是 PM_NOREMOVE ?
[/Quote]

PM_REMOVE 和 PM_NOREMOVE 都试过 循环不能进行 卡在i=1那就不行了
AgentNeo 2012-07-18
  • 打赏
  • 举报
回复
全部代码是这样,还要画图同时实现列表框滚动,现在都能实现,就是暂停不了,只能等循环结束

for(int i=0;i<CNCdata2.lnum;i++)
{

// Select the item in the list box.
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST);
int nCount ;
pListBox->SetCurSel(i-1);



m_layer=CNCdata1[i].Layer;

UpdateData(false);
UpdateWindow();

pDC->MoveTo((int)(rect.right/2-CNCdata1[i].X),(int)(rect.bottom/2-CNCdata1[i].Y));
int i1=i+1;
pDC->LineTo((int)(rect.right/2-CNCdata1[i1].X),(int)(rect.bottom/2-CNCdata1[i1].Y));
Sleep(30);

UpdateWindow();
}


是不是单线程解决不了啊?我是菜鸟,没学过多线程啊,若是在开个线程该怎么开呢,能否给个代码啊?拜托各位大神了!
schlafenhamster 2012-07-18
  • 打赏
  • 举报
回复
PM_REMOVE 还是 PM_NOREMOVE ?
加载更多回复(4)

15,979

社区成员

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

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