Delphi GetTickCount 不是有效整数

Delphi GetTickCount is not a valid integer

我正在尝试使用 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 raised exception class EConvertError with message ''2312357250' is not a valid integer value'.

我做错了什么?

问题是2312357250太大了。尽管它作为 DWORD 是有效的,但十六进制表示形式 89D3C582 相当于一个 DWORD 无法表示的负数,因此出现了消息。

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

产生的

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

UniqueID := StrToInt('2312357250');

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

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

另外,这几行比较麻烦:

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

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

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

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