【问题标题】:Windows sleeps while running a long C++ Visual Studio programWindows 在运行较长的 C++ Visual Studio 程序时休眠
【发布时间】:2015-12-11 05:22:00
【问题描述】:

我使用的是 Windows 8.1、Visual Studio 2013,并且我有一个运行时间超过 15 分钟的 C++ 项目。但问题是,当我仍在调试时,Windows 会进入睡眠状态。

我知道这是因为在运行程序(调试)时超过了睡眠等待时间,我可以通过增加睡眠等待时间或在 Windows 控制面板电源中将设置设置为“从不”睡眠来轻松停止这种情况设置。

但我想要一个基于编程或基于 Visual Studio 的解决方案。我希望我的计算机在程序执行(调试)过程中不要休眠。

【问题讨论】:

标签: c++ visual-studio-2013 windows-8.1 visual-studio-debugging sleep-mode


【解决方案1】:

windows中有SetThreadExecutionState函数

【讨论】:

    【解决方案2】:

    在程序入口点更改设置,在调试会话结束时恢复设置。

    举个例子....

    #include <cstdlib>
    //include windows.h
    
    using namespace std;
    
    void KeepMonitorActive() {
        // Enable away mode and prevent the sleep idle time-out.
        SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);
    }
    
    void RestoreMonitorSettings() {
        // Clear EXECUTION_STATE flags to disable away mode and allow the system to idle to sleep normally.
        SetThreadExecutionState(ES_CONTINUOUS);
    }
    
    int main()
    {
        //Add these 2 lines at the entry point in your program
        KeepMonitorActive();
        atexit(RestoreMonitorSettings);
    
       //...
    }
    

    【讨论】:

    • 这是 C++11 解决方案,但运行此示例不会有问题,因为您已经在使用 VS 2013。VS 2013 支持 std::thread
    • 在大多数情况下,不需要生成单独的线程。通常有一个现有线程(最常见的是主线程)将在进程的生命周期中存在。
    • 不,我的答案正在演变:)
    • 这行得通。感谢用户 1。但是最后一个问题.. 为什么我们不能在 main 方法的开头和结尾直接调用 SetThreadExecutionState() 函数,并带有相关参数。 ?为什么我们使用额外的函数来调用它们?它是一种编码标准,还是按照您的做法有其他用途?
    • 当然,您可以将 KeepMonitorActive() 调用替换为 SetThreadExecutionState()。但不是 RestoreMonitorSettings(),我之所以使用 atexit() 是因为,它将确保它将系统设置恢复回来。如果不使用 atexit(),则必须调用 SetThreadExecutionState(ES_CONTINUOUS);在函数有条件地“返回”的所有地方。从维护的角度来看,在 main() 条目中添加这两行要比修改程序中的所有条件返回要容易得多。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2021-03-17
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多