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

Posted 长沙红胖子Qt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 在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) 的解决方法
  《关于 国产麒麟系统赋值给双精度double时乘以1.0f编译器优化 的解决方法


尝试

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


原因

  编译器在编译的时候对时间除法进行了优化,导致了不可预期的问题:
  


解决

  x轴的时间点变量添加volatile关键字。
  


关键字volatile

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


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

以上是关于关于 在Qt中的timerEvent信号中设置QCustomplot的日期时间轴范围乱蹿(编译器优化变量volatile) 的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

QT定时器的两种应用(QObject就有timerEvent事件,一种什么样的居心呢?)

如何在 Symbian 上的 QT 中设置应用程序图标?

在 Windows 上的 Qt 可执行文件中设置应用程序信息

如何在 Visual Studio 2010 中设置 Qt 路径?

QT 在QTabWidget中设置一些调色板

Qt:不通过信号和槽机制恢复首选项