【问题标题】:Delphi GetTickCount is not a valid integerDelphi GetTickCount 不是一个有效的整数
【发布时间】:2017-07-25 14:00:34
【问题描述】:

我正在尝试使用 GetTickCount 设置唯一 ID

我正在做以下事情

var
UniqueID : DWORD;
LastUniqueID : DWORD;
uniqueString : string;
begin

UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;

uniqueString  := intTostr(LastUniqueID);//or UniqueID 

end;

uniqueString := intTostr(LastUniqueID); 上的整数值无效

Project project1.exe 引发异常类 EConvertError 并显示消息 ''2312357250' 不是有效的整数值'。

我做错了什么?

【问题讨论】:

  • 我敦促您以后确保您发布的代码与您报告的错误相匹配。你在这里没有做到这一点。请养成发布您已验证的minimal reproducible example 的习惯。您发布的代码与错误消息不匹配的事实表明缺乏清晰的思路,这是您进步和发展的基本障碍。当你遇到问题时,放慢脚步,更加努力地思考。在下结论之前先弄清楚你的事实。改善你的思维模式会带来好处。
  • 如果你需要一个唯一的ID,为什么不使用CreatGUID
  • @DavidHeffernan 断电了。我忘记补充说我再次将唯一字符串转换回整数。您没有使用 int64 的回答对我有帮助,谢谢。
  • 这不是借口。在某个时候,您提交了这个误导性问题。请多加注意。

标签: delphi delphi-10-seattle


【解决方案1】:

很遗憾,您显示的代码与您报告的错误消息不匹配。您的实际代码调用StrToInt 而不是IntToStr。我知道这一点是因为该错误消息是通过调用StrToInt 而不是IntToStr 产生的。

您的代码看起来更像这样:

UniqueID := StrToInt('2312357250');

请注意,StrToInt 返回有符号的 32 位整数类型。有效值在 -2,147,483,648 到 2,147,483,647 的范围内。您的值超出了Integer 的有效范围,因此出现错误。

如果您想要一种简单的方法来解决所有这些范围问题,请使用Int64 而不是DWORDInteger,并致电StrToInt64

此外,这些行很麻烦:

UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;

您对GetTickCount 进行了两次不同的调用。这两个调用可能会产生不同的值。事实上,如果GetTickCount 翻转,那么第二次调用可能会返回一个小于第一次调用的值。

更多的麻烦围绕着GetTickCount + 1000。如果GetTickCount返回一个接近上限的值,那么你会遇到整数溢出,这可能会产生你意想不到的结果。使用GetTickCount64 来避免这个陷阱。

但是,我仍然相信系统滴答计数是生成唯一 ID 的好方法。根据您的要求,无论是什么问题,这都可能是您问题的一个糟糕的解决方案。从表面上看,您的代码似乎阻止了请求唯一 ID 的时间比您上次请求的时间晚不到一秒。当然,在不了解您的要求的情况下,很难推荐替代方案。

【讨论】:

  • 我不确定这是否是错误的原因,尤其是因为我无法在此处重现它。对 IntToStr 的调用使用 Int64 重载,因此在提供 DWord 值时不应因 EConvertError 而失败。
  • @Uwe 你是对的。事实上,我被提问者提供的代码与错误消息不匹配的事实欺骗了。他们实际上是在打电话给StrToInt。谢谢。
  • 使用GetTickCount64()UInt64 可以避免溢出问题。
  • @RemyLebeau 只要我们乐意排除正常运行时间超过 584942417 年的系统...... ;-)
  • @RemyLebeau 根本不用 gettickcount 我可以在 indy 中使用 ticks64 吗?
【解决方案2】:

问题是 2312357250 太大了。虽然它作为 DWORD 是有效的,但十六进制表示 89D3C582 相当于一个负数,而 DWORD 不能表示,因此是消息。

【讨论】:

  • 作为 DWORD 有效但 DWORD 不能表示?这些答案感觉不对。
  • 没有负的 DWORD,十六进制表示可能是负的整数,而不是 DWORD。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多