声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3394|回复: 4

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

[复制链接]
发表于 2007-4-3 05:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

界面为:
4b67707502000erg.gif


代码为:

  1. #include
  2. #include
  3. #include "aaa.h"
  4. static int panelHandle;
  5. int main (int argc, char *argv[])
  6. {
  7. if (InitCVIRTE (0, argv, 0) == 0)
  8.   return -1; /* out of memory */
  9. if ((panelHandle = LoadPanel (0, "aaa.uir", PANEL)) < 0)
  10.   return -1;
  11. DisplayPanel (panelHandle);
  12. RunUserInterface ();
  13. DiscardPanel (panelHandle);
  14. return 0;
  15. }
  16. int CVICALLBACK QuitCallback (int panel, int control, int event,
  17.   void *callbackData, int eventData1, int eventData2)
  18. {
  19. switch (event)
  20. {
  21.   case EVENT_COMMIT:
  22.    QuitUserInterface (0);
  23.    break;
  24. }
  25. return 0;
  26. }
  27. int CVICALLBACK timer (int panel, int control, int event,
  28.   void *callbackData, int eventData1, int eventData2)
  29. {
  30. int textleft;
  31. int textwidth;
  32. int panelwidth;
  33. switch (event)
  34. {
  35.   case EVENT_TIMER_TICK:
  36.    GetPanelAttribute (panelHandle, ATTR_WIDTH, &panelwidth);
  37.    GetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_WIDTH, &textwidth);
  38.    GetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, &textleft);
  39.    SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, textleft -= 10);   //本句放在上面与下面效果不同     
  40.    if (textleft <= -textwidth)
  41.    {
  42.     SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, panelwidth);
  43.    }
  44.    
  45. //   SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_LEFT, textleft -= 10);     //本句放在上面与下面效果不同
  46.    break;
  47. }
  48. return 0;
  49. }
复制代码

  各位看官可以调整一下有注释两句的位置,看看会有什么结果,问题出在哪?我也不是很明白,请大家讨论!

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

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2007-4-3 09:33 | 显示全部楼层

这个到没有很注意!

下来可以细看看!
发表于 2009-7-17 02:04 | 显示全部楼层
确实如此啊 楼主 我今天也发现编译器有问题了 对if语句 的判断 时序出问题了 :handshake
头像被屏蔽
发表于 2010-4-3 14:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2010-4-3 15:32 | 显示全部楼层
楼上为广告帖请删除! 已禁止访问
一一报告还需等45秒! 没时间等 :@Q

处理完记得也删除此帖
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-6 21:36 , Processed in 0.063525 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表