带有ES_CONTINUOUS的SetThreadExecutionState - 如果应用程序在重置标志之前崩溃会发生什么

时间:2015-06-05 00:42:37

标签: c++ winapi

我将使用SetThreadExecutionState WinAPI函数在某项工作期间保持系统运行。

SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);

根据MSDN,如果使用ES_CONTINUOUS,应用程序必须清除作业完成后设置的标记。

如果我的应用程序在作业期间崩溃,我将无法清除之前设置的标志。我的问题是,当应用终止或者系统保持清醒时,系统是否会清除应用设置的标志?

2 个答案:

答案 0 :(得分:2)

是的,当设置它们的线程不再存在时,系统将清除(或更准确地说,丢弃)标志。

线程是干净地退出还是被终止无关紧要。

注意:我只能根据自己的经验确认一旦进程退出就会忽略这些标志,但是函数的名称强烈暗示每个线程而不是每个进程设置标志。

答案 1 :(得分:2)

根据System Sleep Criteria文档:

  

系统维护一个名为SetThreadExecutionState的应用程序计数。 系统会跟踪调用SetThreadExecutionState 的每个线程,并相应地调整计数器。如果此计数器达到零并且没有任何用户输入,则系统进入休眠状态。

所以可以想象,如果应用程序崩溃并且调用线程消失,系统将相应地知道并调整计数器,就像对大多数其他线程敏感的资源一样。