LastInput.time是一个整数,m_idleTime也是一个整数。这一行有时会产生溢出异常,我认为当两个值都是大的负值时会发生这种情况。
(Environment.TickCount - lastInput.time) > m_idleTime
我该如何避免?铸造?
(CType(Environment.TickCount,Long) - CType(lastInput.time,Long)) > m_idleTime
或者也许是这个演员?
CType((Environment.TickCount - lastInput.time),Long) > m_idleTime
提前致谢。
编辑:我正在使用GetLastInputInfo方法来检查计算机空闲的时间。我通过这种方式声明了调用的返回值:
<StructLayout(LayoutKind.Sequential)> Public Structure StructLastInputInfo
<MarshalAs(UnmanagedType.U4)> Dim size As Integer
<MarshalAs(UnmanagedType.U4)> Dim time As Integer
End Structure
所以我认为当Environment.TickCount返回负值时,GetLastInputInfo会发生同样的情况,对吧?但是,减法的价值将是错误的,因为它们将是负面的,所以就我看到问题应该做的是:
Math.Abs(CType(Environment.TickCount, Long) - CType(lastInput.time, Long)) > m_idleTime
您怎么看?
答案 0 :(得分:1)
假设问题与您所描述的一样,您需要第一个选项:
(CType(Environment.TickCount,Long) - CType(lastInput.time,Long)) > m_idleTime
第二个在转换为Long之前会失败,因为转换是在计算之后完成的。
但我认为你不应该在这个计算中有大的负值。请注意,在24.9天后,Environment.TickCount溢出并变为负数。也许这就是发生的事情?如果是这样,上面的代码将不会抛出,但它会给出错误的答案。
你为什么这样做?为什么不只比较两个DateTimes?
答案 1 :(得分:1)
是的,此代码将在机器运行2 ^ 31毫秒后爆炸。您无法在VB.NET中有选择地抑制溢出检查。对此只有一个修复:项目+属性,编译选项卡,向下滚动,高级编译选项,选中“删除整数溢出检查”。这不是一个可怕的损失,但你确实失去了一定程度的保护。
另一种不会导致溢出的方法是使用DateTime.UtcNow。减法生成TimeSpan,使用其TotalMilliseconds属性。准确性是一样的。请注意它返回Double,避免相等检查。
答案 2 :(得分:0)
在C#中我们只使用“未选中”块。不确定VB.NET中的等价物是什么。
答案 3 :(得分:0)
这就是我解决问题的方法:
currentTime = BitConverter.ToUInt32(BitConverter.GetBytes(Environment.TickCount), 0) #'' This code can fail with 1 tick error when changing the sign of one item.
lastInputTime = BitConverter.ToUInt32(BitConverter.GetBytes(lastInput.time), 0)
If currentTime - lastInputTime > m_idleTime Then
此代码有效,因为您获取了Integer的字节并只使用它们就好像它们在UInteger中一样,这不会抛出OverflowException。
我看到的唯一问题是,当一个项目的符号发生变化时,在减法时出现1个单位错误,不确定发生了什么,但无论如何都有1个勾选错误不是问题。