在Qt中是否有办法禁止计算机进入睡眠状态?

时间:2014-05-13 21:31:11

标签: c++ macos qt qt5

我正在编写一个Qt应用程序来执行一些繁重的计算,但是在Mac上(可能也在Windows上但我目前无法检查),一旦计算机进入睡眠模式,执行就会停止。

即使屏幕转到屏幕保护程序或空白,我想要一种继续执行的方法。显然,您可以要求用户更改他/她的能量设置,但这远非理想的解决方案。有没有正确的方法呢?

3 个答案:

答案 0 :(得分:3)

这有两个方面:

  1. 强制睡眠如果用户打算让系统进入睡眠状态,并且您阻止它,则您的用户可能会诅咒您。强迫睡眠也是能源和热量管理的一部分,对于防止数据丢失和避免硬件破坏以及降低可能的火灾风险至关重要。

    当我关闭笔记本电脑的盖子时,它最好进入睡眠状态,如果我发现一个试图绕过它的应用程序,它最好是免费的,否则我会打电话给我的信用卡公司进行退款。这很简单,我希望很容易理解为什么会如此。

  2. 空闲睡眠您要做的不是阻止系统完全进入睡眠状态,而只是禁用空闲睡眠。

  3. this answer中介绍了禁用空闲睡眠。

答案 1 :(得分:2)

在彻底搜索Qt 5.2 API之后,Qt似乎没有提供任何改变能量设置的功能(因此对于Mac或任何其他操作系统都没有)。我还没有发现它在路线图上有任何迹象。

可以找到使用Apple的Objective-C API的Mac OSX的可能解决方案here(谢谢,@ Kuba)。

在Windows上,可以使用SetThreadExecutionState函数处理电源设置(请参阅this question,C#)。

答案 2 :(得分:1)

如果你想避免使用Objective-C API,那么它就有一个基于C的API。您可以使用IOPMAssertionCreateWithDescription()的断言类型调用kIOPMAssertionTypePreventUserIdleSystemSleep。这为您提供了断言ID引用。您使用IOPMAssertionRelease()取消断言以匹配创建呼叫和您可能进行的任何IOPMAssertionRetain()呼叫。

CFURLRef bundleURL = CFBundleCopyBundleURL(CFBundleGetMainBundle());
CFStringRef bundlePath = CFURLCopyFileSystemPath(bundleURL, kCFURLPOSIXPathStyle);
CFRelease(bundleURL);

IOPMAssertionID assertion;
IOReturn result = IOPMAssertionCreateWithDescription(kIOPMAssertionTypePreventUserIdleSystemSleep,
    CFSTR("A name which makes sense for your app"),
    CFSTR("Some details"), CFSTR("A human-readable reason"),
    bundlePath, 0, NULL, &assertion);
CFRelease(bundlePath);
if (result != kIOReturnSuccess)
    /* handle error */;

// ... do computation ...

IOPMAssertionRelease(assertion);