MFC 消息泵

洋航 2017-09-15 11:18:52
void CDMCd2Dlg::OnZero()
{
// TODO: Add your control notification handler code here
UpdateData(true);//刷新参数
dmc_set_pulse_outmode(m_Card,m_nXaixs,0); //设置脉冲输出模式
dmc_set_profile(m_Card,m_nXaixs,m_nSpeedmin,m_nSpeedmax,m_nAcc,m_nDec,500);//设置速度曲线
dmc_set_homemode(m_Card,m_nXaixs,m_nPositive,m_nLowspeed,m_nHome,1);//设置回零方式
dmc_home_move(m_Card,m_nXaixs);//回零动作
while (dmc_check_done(m_Card,m_nXaixs)==0) //判断当前轴状态需要很长时间
{
AfxGetApp()->PumpMessage();
GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
}
GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
UpdateData(false);
}


我对这一句AfxGetApp()->PumpMessage();理解是,当进入while以后,为了防止阻塞了当前线程,无法响应其他操作。加AfxGetApp()->PumpMessage()处理消息, ;我不知道是不是这样去理解,网上搜素了关于消息泵资料,感觉我理解没有错, 问我公司高手,说这个函数没有用,说这个函数是用来截取消息的,我感觉不对,又问了个人,他告诉我这个函数功能和线程挂起一样sleep, 感觉都在敷衍我,特此请教各位大神,
...全文
467 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
洋航 2017-09-19
  • 打赏
  • 举报
回复
dmc_check_done不是我写的,是买雷塞卡,他们提供的LIB,dmc_check_done是查询状态电机原点信号状态,实时性要求高,若用SLEEP的话把线程挂起,回原点回不准,怕信号来 线程却挂起来, 我很感谢你的回答
draculamx 2017-09-18
  • 打赏
  • 举报
回复
你说dmc_check_done函数耗时,其实就可以把它当作SLEEP来看待,如果dmc_check_done是你自己写的,并且内部有一个“循环等待”的过程,那么你可以把PumpMessage 放到那个“循环等待”的过程中,就可以达到你的目的了
draculamx 2017-09-18
  • 打赏
  • 举报
回复
http://blog.163.com/dingmz_frcmyblog/blog/static/217304023201342751342435/ 这是我找的一片文章,我也看了一下, PumpMessage起到消息泵的作用,其原理就是使用GetMessage或PeekMessage函数从消息队列中逐个读取消息,然后进行必要处理之后再发送出去。 从你的代码来看 while (dmc_check_done(m_Card,m_nXaixs)==0) //判断当前轴状态需要很长时间 { AfxGetApp()->PumpMessage(); GetDlgItem(IDC_BUTTON1)->EnableWindow(false); } 你的很耗时的操作,在dmc_check_done函数中,那么你在这里使用AfxGetApp()->PumpMessage();是起不到作用的,如果不是用多线程,你的GUI界面会卡住。 我不知道dmc_check_done函数是否你自己写的,我在这里将其简单的理解为SLEEP(); 我个人理解 PumpMessage 应该放在如下情况中才有点作用: while(10000000000000) //执行次数很多,造成耗时过长 { AfxGetApp()->PumpMessage(); dosomething();//这个函数本身的耗时并不长 } dosomething函数,本身耗时不长,但是要执行很多次,界面会卡住,这个时候,你在循环中,使用PumpMessage,才能防止界面被卡死 这是我对 PumpMessage 函数,应用场合的理解
draculamx 2017-09-18
  • 打赏
  • 举报
回复
i=0; while(i>10000000000000) //执行次数很多,造成耗时过长 { AfxGetApp()->PumpMessage(); dosomething();//这个函数本身的耗时并不长 i++; } 上面写的太随意了。。。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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