zoukankan      html  css  js  c++  java
  • 警惕程序中数据类型不一致导致错误

    1,问题的缘由

    本人在编程中需要在线程中定期执行某个任务,于是将上次执行任务的时间进行标记,在线程的execute循环中,每次循环都判断当前时间与上次执行时间是否已经达到指定的时间间隔,若是才执行。

    具体代码如下:

    procedure Thread_chargeControllerIntf.Execute;
    
    begin
    
      if not PreprareWork then exit;
    
     
    
      while not FStop do
    
      try
    
        DoWork;
    
        sleep(1000);
    
        KeepDBConnection;
    
     
    
      except
    
        on e:Exception do
    
          try
    
            addLog_fromThread('Thread_chargeControllerIntf执行出错:'+ e.Message);
    
          except
    
     
    
          end;
    
      end;
    
     
    
    end;
    procedure Thread_chargeControllerIntf.KeepDBConnection;
    
    begin
    
      //防止 GetTickCount函数重新计数
    
      if self.FLastKeepTick > GetTickCount() then
    
    FLastKeepTick := 0;
    
     
    
      //每小时执行一次  
    
      if  GetTickCount() - FLastKeepTick < 3600*1000 then
    
        Exit;
    
     
    
      FLastKeepTick := GetTickCount();
    
      uFunc.ThreadQuery('select 1');
    
      addLog_fromThread('KeepDBConnection.');
    
    end;

    该线程通过调用KeepDBConnection函数,达到每小时访问一次mysql数据库,以保持数据库连接不被DBMS中断的目的。

    其中,FLastKeepTick integer类变量,保存上次执行数据库查询的时间。

    该段代码以前正常运行,每小时执行一次。但最近却突然发现,变为每秒执行一次。

    日志如下:

    2021-01-20 08:40:38 KeepDBConnection.
    
    2021-01-20 08:40:39 KeepDBConnection.
    
    2021-01-20 08:40:40 KeepDBConnection.
    
    2021-01-20 08:40:41 KeepDBConnection.
    
    2021-01-20 08:40:42 KeepDBConnection.

    2,问题分析

    代码跟踪发现,FLastKeepTick在存储GetTickCount()返回的数值时,没有如想象中为正整数,而是变为了负值。如:

    2021-01-20 08:42:04 FLastKeepTick=-1832924107
    
    2021-01-20 08:42:04 GetTickCount=2462044189

    可见,FLastKeepTick在存储时,并不是存为2462044189,因为该值已经超出integer的范围,导致其存为相应的负值,即 2462044189- 4294967296(256*256*256*256) =-1832924107

    3,问题解决

    找到原因,解决问题很简单,就是要将FLastKeepTick声明为DWord类型,而不是integer类型,而且GetTickCount函数的返回类型本来就是DWord类型。

    实测将FLastKeepTick声明为DWord类型后,程序恢复正常,问题解决。

  • 相关阅读:
    mysql数据库开放远程连接的方法
    MySQL数据库字符集由utf8修改为utf8mb4一例
    解决silk-v3-decoder-master转换wav时,百度语音解析问题
    PHP高效率写法(详解原因)
    如何计算服务器能够承受多大的pv?
    微信开发中使用curl忽略https证书
    PHP libevent函数基本介绍
    PHP stream相关协议及上下文选项和参数归纳
    Centos搭建PHP5.3.8+Nginx1.0.9+Mysql5.5.17
    编码转换(UTF8->GBK)
  • 原文地址:https://www.cnblogs.com/jackkwok/p/14301200.html
Copyright © 2011-2022 走看看