Visual c++ VisualStudio如何将假变为真(可能通过计时器事件)?

Visual c++ VisualStudio如何将假变为真(可能通过计时器事件)?,visual-c++,timer,event-handling,visual-studio-debugging,Visual C++,Timer,Event Handling,Visual Studio Debugging,大约一个小时以来,我一直在试图解释一些非常令人不安的行为,不确定它是由VisualStudio的编译器还是调试器引起的。我现在知道了部分答案。基本上,我在MSVC2005调试版本中编译并运行了以下内容: DWORD timeStamp; struct SomeEventStruct { DWORD timeStamp; // ... plus other data }; void Magic( const SomeEventStruct & anEvent ) { if

大约一个小时以来,我一直在试图解释一些非常令人不安的行为,不确定它是由VisualStudio的编译器还是调试器引起的。我现在知道了部分答案。基本上,我在MSVC2005调试版本中编译并运行了以下内容:

DWORD timeStamp;
struct SomeEventStruct {
  DWORD timeStamp;
  // ... plus other data
};
void Magic( const SomeEventStruct & anEvent )
{
    if ( anEvent.timeStamp < timeStamp )
    {
      ASSERT( false ); // shouldn't happen! Time does not run backwards!
    }
    timeStamp = anEvent.timeStamp;
}
DWORD时间戳;
struct SomeEventStruct{
DWORD时间戳;
//…加上其他数据
};
void Magic(const SomeEventStruct&anEvent)
{
if(anEvent.timeStamp
ASSERT(false)
甚至可以执行的唯一方法是如果
if
表达式的计算结果为true,对吗?那么,当启动
ASSERT()
时,我闯入调试器检查变量的值时,我经常发现
timeStamp
是0,这是怎么回事呢?根据定义,这是不可能的-无符号值不能小于零

诚然,这是一个多线程的应用程序,但是没有其他线程涉及这些变量——它们都在主UI线程中。我还简化了情况——它们实际上是成员变量和函数,我认为这并不重要。我认为相关的是变量值在
ASSERT()
第一次启动并邀请我进入调试器时是合理的,在调试器中我发现了一个错误的时间戳。直到继续下去,事情才开始变得奇怪起来

最后,我发现时间戳值在
if
语句和
ASSERT(false)
语句之间被重置为零。我知道,唯一一行可能执行此操作的代码最终连接到计时器事件(不同于上面的时间戳事件-计时器触发以刷新我感兴趣的系统事件的显示)


所以现在我想知道:windows计时器事件的行为是否像中断一样,在某个点暂停线程执行,然后在稍后返回到它。。。或者这里发生的事情是VS调试器特有的,还是
ASSERT()
的内部工作特有的?如果我想阻止计时器事件处理程序在前一次调用完成之前运行,是否由我来阻止重新进入?

有一点是肯定的:这与Visual Studio无关@基伦-这是讽刺吗?;-)当我遇到这种情况时,我做的第一件事就是“全部重建”,因为当VS尝试进行增量构建而不是完全重建时,通常会出现奇怪的结果。