与i7处理器相比,使用Windows API CreateWaitableTimer休眠在Xeon上执行的方式有所不同

问题描述 投票:3回答:1

我正在开发一个需要持续〜1ms睡眠的程序。使用睡眠是为了生成长度约为1 ms的硬件脉冲。

我正在使用以下代码进行睡眠

void usleep(__int64 usec)
{
  HANDLE timer;
  LARGE_INTEGER ft;
  ft.QuadPart = -(10*usec); // Convert to 100 nanosecond interval, negative value indicates relative time

  timer = CreateWaitableTimer(NULL, TRUE, NULL);
  SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0);
  WaitForSingleObject(timer, INFINITE);
  CloseHandle(timer);
}

取自here

[当我在Intel i7上使用以上代码(使用Embarcaderos bcc32编译器)时,经过1000(1毫秒),我得到的睡眠是使用Poco's timestamp函数测得的,约为1毫秒。代码本身在线程中执行。

代码看起来像这样:

    mDebugFile <<  std::setprecision (17) << mPulseEventTime.elapsed()/1000.0 << "\t" << 0 << "\n";
    setHigh(false);
    mDebugFile <<  std::setprecision (17) << mPulseEventTime.elapsed()/1000.0 << "\t" << 1 << "\n";       
    usleep(1000);
    mDebugFile <<  std::setprecision (17) << mPulseEventTime.elapsed()/1000.0 << "\t" << 1 << "\n";
    setLow(false);
    mDebugFile <<  std::setprecision (17) << mPulseEventTime.elapsed()/1000.0 << "\t" << 0 << "\n";

其中mDebugFile是fstream对象,而setLow / setHigh是对硬件的调用。

但是,当在Xeon CPU]上执行相同的代码时,睡眠被测量为大约10 ms。假设Poco的计时功能提供了适当的时间,则要求1ms时10ms相当大。

还有其他方法可以使〜1ms的可靠睡眠吗?是否可以修改Windows操作系统以提供更可靠的睡眠?

我无权使用Boost或更高版本的C ++ 11功能。

我正在开发一个需要持续〜1ms睡眠的程序。使用睡眠是为了生成长度约为1 ms的硬件脉冲。我将以下代码用于睡眠void usleep(__ int64 ...

c++ windows time c++builder
1个回答
0
投票

Windows不是实时操作系统,因此将永远无法保证在用户代码中获得超精确的睡眠时间。有很多东西在玩。

© www.soinside.com 2019 - 2024. All rights reserved.