christy 发表于 2007-4-3 05:42

[转贴]LabWindows/CVI的定时器BUG

  有人说LabWindows/CVI没有什么编译上的问题,我却一直都持反对态度!有一次,我在做一个数据采集时,突然发现它的定时器好像存在一些 BUG。我百思不得其解,最后就不了了之了!每当我在用定时器调试程序的时候,我一直都是认为NI的编译器有问题,先把程序代码调换一个位置,如果还是有问题,才从自己的角度找错误!听说他们的编译器不是自己做的,而是买来的,当我问他们是从哪买的时候,却保持了缄默!目前,我也是在稀里糊涂地用!当然了,只要能每种编程的平台都有它们自己的一些错误,有错误并不可怕,可怕的是不知道怎么解决!所以在写代码的时候,我最讨厌用定时器,却还是不得不用!最讨厌响应一些高级的鼠标事件,却经常用到!
  再有,就是它的事件响应机制!不知各位看官发现没有,LabWindows/CVI在响应鼠标事件的时候,其实是将消息传递给面板,然后再由面板传递给控件!我的老天,这简直就是天方夜谭!如果把握不好事件的响应,不了解的看官将某些事件写入了面板的回调函数,就会产生不可思议的效果!但,事情总是两面的!换一个角度来思考,我们可以利用它的消息传递机制,也可以写出一些有意思的代码来!NI的思路属于逆其道而行之,就像欧阳峰练九阴真经打通了仁笃二脉一样,结果是天下无敌,后果则是疯疯颠颠!
  看过《东邪西毒》的观客可能会想起欧阳老前辈的一句话:“很多年之后,我有个绰号叫做西毒,任何人都可以变得狠毒,只要你尝试过甚么叫忌炉,我不会介意他人怎样看我,我只不过不想别人比我更开心。”其实,可以把这句话改一下:“很多年之后,我开始用CVI,任何人都可以用它,只要你尝试过甚么叫编程,我不会介意他人怎样实现其功能,我只不过是想让别人知道我的思路。”
  好了,有一段代码让诸位看一下,它就是在用定时器时如果改变代码顺序而引起的一些问题!

界面为:



代码为:

#include
#include
#include "aaa.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "aaa.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK QuitCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
   QuitUserInterface (0);
   break;
}
return 0;
}
int CVICALLBACK timer (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int textleft;
int textwidth;
int panelwidth;
switch (event)
{
case EVENT_TIMER_TICK:
   GetPanelAttribute (panelHandle, ATTR_WIDTH, &panelwidth);
   GetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_WIDTH, &textwidth);
   GetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, &textleft);
   SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, textleft -= 10);   //本句放在上面与下面效果不同   
   if (textleft <= -textwidth)
   {
    SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, panelwidth);
   }
   
//   SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, textleft -= 10);   //本句放在上面与下面效果不同
   break;
}
return 0;
}
  各位看官可以调整一下有注释两句的位置,看看会有什么结果,问题出在哪?我也不是很明白,请大家讨论!

转自:小信的BLOG http://blog.sina.com.cn/u/4b677075010006ps

xingchen 发表于 2007-4-3 09:33

这个到没有很注意!

下来可以细看看!

bingyusky 发表于 2009-7-17 02:04

确实如此啊 楼主 我今天也发现编译器有问题了 对if语句 的判断 时序出问题了 :handshake

雷连鸣x20 发表于 2010-4-3 14:41

ChaChing 发表于 2010-4-3 15:32

楼上为广告帖请删除! 已禁止访问
一一报告还需等45秒! 没时间等 :@Q

处理完记得也删除此帖
页: [1]
查看完整版本: [转贴]LabWindows/CVI的定时器BUG