您的位置:首页->DMC1000控制卡不能响应系统消息的原因是什么?

相关链接

·激光技术革新放射仪实现“即插即用”
·指北针为何指北?
·万用表应用技巧有哪些?
·焊接的注意?
·运算放大器是什么?
·温度计有哪些?
·钳形电流表是什么?
· 集成运算放大器是什么?
·电磁流量计使用中的常见故障主要有哪些?
·原子吸收分光光度法常使用哪些定量分析方法?


DMC1000控制卡不能响应系统消息的原因是什么?
一、问题现象及分析

  问题经常通过以下编程表现出来:

  //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();