【问题标题】:System does not sleep after restoring the default settings using SetThreadExecutionState使用 SetThreadExecutionState 恢复默认设置后系统不休眠
【发布时间】:2013-11-29 11:05:16
【问题描述】:

我创建了一个防止系统休眠的方法如下:

    public static void KeepSystemAwake(bool bEnable)
    {
        if (bEnable)
        {
            EXECUTION_STATE state = SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
        }
        else
        {
            EXECUTION_STATE state = SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
        }
    }

该方法阻止系统休眠,但是当我调用该方法的 ES_CONTINUOUS 部分时,当我希望它正常运行时,系统根本不会休眠。我错过了什么?我在不同的线程(定时器)中运行这段代码

【问题讨论】:

  • 当我希望它正常运行时,系统根本不休眠 大概你已经证明没有其他进程调用SetThreadExecutionState 来保持PC 清醒,对吧?
  • 是的。它只是我的应用程序。当我停止我的应用程序时,一切都恢复正常

标签: winapi c#-4.0 timer pinvoke


【解决方案1】:

我在不同的线程(定时器)中运行这段代码

如果您使用类似System.Threading.Timer 回调,它将在不同(读取:任意)线程上调用。

来自MSDN

定时器执行的回调方法应该是可重入的,因为它是在ThreadPool线程上调用的

确保您正在为同一个线程调用SetThreadExecutionState。理想情况下,您会将调用序列化到一个线程(如主线程)。

【讨论】:

  • 我会尝试在我的应用程序的 UI 线程上运行 SetThreadExecutionState 并告诉你:)
  • 你是对的。我确保 SetThreadExecutionState 只发生在一个线程上,现在它可以完美运行。谢谢
猜你喜欢
  • 2015-09-24
  • 1970-01-01
  • 2022-06-30
  • 2018-02-12
  • 2012-05-24
  • 2015-10-31
  • 2013-07-26
  • 2019-05-04
  • 2015-03-27
相关资源
最近更新 更多