【问题标题】:GetProcessTimes called periodically returns the same results定期调用 GetProcessTimes 会返回相同的结果
【发布时间】:2013-08-09 02:18:59
【问题描述】:

我在一个循环中定期调用GetProcessTimes(),它在每次迭代中执行相同的操作,但它似乎每次都生成相同的结果,并且只是不时更改。这是正常行为吗?结果不应该随着时间的推移而改变吗?

void ImCalledPeriodically() {

    static const DWORD  dwPid = ::GetCurrentProcessId();
    static const HANDLE hProc = ::OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPid );

    static FILETIME ftUnused1, ftUnused2; // Unused, mandatory parameters.
    ULARGE_INTEGER uliUsr, uliKrn;

    ::GetProcessTimes( hProc, & ftUnused1, & ftUnused2, (_FILETIME *)& uliKrn, (_FILETIME *)& uliUsr);

    printf("usr=%I64d krn=%I64d", uliUsr.QuadPart, uliKrn.QuadPart );

    // etc...
}

输出值只会随时间变化,例如:

641002, 641002, 641002, 641002 然后 1092007, 1092007, 1092007, 1092007 等等……

不应该每次都换几个吗?函数内部是否有某种刷新率?

感谢您的帮助。

【问题讨论】:

  • 呃,为什么要将指向 ULARGE_INTEGER 的指针传递给需要指向 FILETIME 结构的指针的函数?
  • 这是个好问题。这不是我自己的代码,它操纵我已经接近 x)
  • @CodyGray:这是因为他想使用QuadPart 成员,而FILETIME 缺少该成员。
  • 这并不正确。将函数传递给它想要的类型,然后将其转换为您想要的类型。这两种类型不一样。
  • ULARGE_INTEGER 仅适用于 little-endian 平台。

标签: c++ c windows process cpu


【解决方案1】:

您可能已经注意到,这些值大约每 16 毫秒更改一次,这是 Windows 用于其计时器和线程时间片的默认时间间隔。所以,如果你在一个相对紧凑的循环中进行调用,你会得到重复的值。

除此之外,时间显示实际 CPU 消耗。如果您的进程在两次调用之间几乎没有工作,则时间不会增加。

【讨论】:

  • 谢谢,但实际上每次通话之间有超过一秒钟的时间,所以我想这不是导致问题的原因。即使过程不多,时间不应该增加一点点吗?
  • 具体来说,这些值仅在线程的时间片结束时发生变化。
  • 这意味着我的线程可以不间断地工作超过一秒钟?
  • @Virus,它们不能增加一点点,因为我在回答中描述的最小增加间隔是 16 毫秒。所以,在你消耗 16 毫秒的 CPU 之前,不会有任何增加。
  • @Virus721:小修正 - 计时器(默认)每秒更改 64 次。仅用于检查此答案是否正确,您可以通过调用 timeBeginPeriod / timeEndPeriod 来运行您的程序并设置定时器周期。但请不要在程序的最终版本上更改 Windows 计时器。 msdn.microsoft.com/en-us/library/windows/desktop/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
相关资源
最近更新 更多