一、问题现象及分析
问题经常通过以下编程表现出来:
//X发出脉冲后,等待脉冲发完后再做其它事情
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 );
老版本的库函数如下:
d1000_start_tr_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 );
或者:
d1000_wait_done( 0 );
此函数内部实际上包含类似于while( d1000_check_done(0) == 0 );的语句
以上可以看出,在检测脉冲是否发完时,此段代码的执行完全独占了CPU分配给当前进程的所有时间,
因而也排挤了其它消息的响应,当然也就不能响应定时器读取位置,或其它停止操作等.
二、解决方法
解决此问题关键是让while循环时能检测系统消息,以下分别介绍在VB,VC,CB下的解决措施:
注:以下编程全以DMC1000最新的驱动库函为参考
1.VB编程
d1000_start_t_move 0, 6400, 3200, 6400, 0.1
DO
DoEvents
LOOP WHILE (d1000_check_done(0) = 0)
2.VC编程
在VC下编程关键是要解决类似于VB的DoEvnets函数
void DoEvents()
{
static MSG msg;
if( ::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) ){
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
然后编程如下:
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 )
::DoEvents();
3.CB编程
同样也需要完成一个DoEvents函数的定义:
void DoEvents()
{
Application->ProcessMessages();//VCL给程序带来极大简化
}
编程如下:
d1000_start_t_move( 0, 6400, 3200, 6400, 0.1 );
while( d1000_check_done(0) == 0 )
::DoEvents(); 
|