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, 感覺都在敷衍我,特此請教各位大神,
uj5u.com熱心網友回復:
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 函式,應用場合的理解
uj5u.com熱心網友回復:
你說dmc_check_done函式耗時,其實就可以把它當作SLEEP來看待,如果dmc_check_done是你自己寫的,并且內部有一個“回圈等待”的程序,那么你可以把PumpMessage 放到那個“回圈等待”的程序中,就可以達到你的目的了uj5u.com熱心網友回復:
i=0;while(i>10000000000000) //執行次數很多,造成耗時過長
{
AfxGetApp()->PumpMessage();
dosomething();//這個函式本身的耗時并不長
i++;
}
上面寫的太隨意了。。。
uj5u.com熱心網友回復:
dmc_check_done不是我寫的,是買雷塞卡,他們提供的LIB,dmc_check_done是查詢狀態電機原點信號狀態,實時性要求高,若用SLEEP的話把執行緒掛起,回原點回不準,怕信號來 執行緒卻掛起來, 我很感謝你的回答轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/54909.html
