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

SetThreadExecutionState with ES_CONTINUOUS - what happens if app crashes before resetting flags

我打算在某项工作中使用SetThreadExecutionState WinAPI函数来保持系统运行。

SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);

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

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

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

线程是干净退出还是被终止并不重要。

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

根据 System Sleep Criteria 文档:

The system maintains a count of applications that have called SetThreadExecutionState. The system tracks each thread that calls SetThreadExecutionState and adjusts the counter accordingly. If this counter reaches zero and there has not been any user input, the system enters sleep.

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