关于 在Qt中的timerEvent信号中设置QCustomplot的日期时间轴范围乱蹿(编译器优化变量volatile) 的解决方法

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127857665

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:各种问题解决(点击传送门)


问题

  在开发QCustomplot时,将x轴设置为日期时间轴时,采用tiimerEvent刷新,按照常规在设置轴的范围放在timerEvent中,实际出现日期时间范围乱窜,上图:
  


相关博客

  《关于 在Qt中的timerEvent信号中设置QCustomplot的日期时间轴范围乱蹿(编译器优化变量volatile) 的解决方法》
  《关于 国产麒麟系统中双精度double除法编译优化导商变量不变化(代码调整+volatile) 的解决方法》


尝试

  1.不使用毫秒,使用秒的时候,是正常的,但是移动就是一格一格了;
  2.使用毫秒就有问题,并且range范围也不对,添加打印测试,在生成时间和设置范围之间添加打印时ok的;
  
  3.在设置范围之后,replot之前打印,x乱窜,不行;
  4.replot后打印,x乱崔,不行
  


原因

  编译器在编译的时候对时间除法进行了优化,导致了不可预期的问题:
  关于 在Qt中的timerEvent信号中设置QCustomplot的日期时间轴范围乱蹿(编译器优化变量volatile) 的解决方法_第1张图片


解决

  x轴的时间点变量添加volatile关键字。
  关于 在Qt中的timerEvent信号中设置QCustomplot的日期时间轴范围乱蹿(编译器优化变量volatile) 的解决方法_第2张图片


关键字volatile

  volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用volatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127857665

你可能感兴趣的:(Qt开发,qt,c++)