2014-05-13 94 views
4

我正在编写一个Qt应用程序,它执行一些繁重的计算,但在Mac上(可能还在Windows上,但我目前无法检查这一点),只要计算机进入休眠模式,执行就会停止。Qt有没有办法阻止电脑进入睡眠状态?

我想继续执行的方式,即使屏幕转到屏幕保护程序或空白。显然你可以要求用户改变他/她的能量设置,但这远非理想的解决方案。有没有适当的方法来做到这一点?

+1

说不上如果Qt拥有一个API来做到这一点,但对于苹果这应该工作:http://stackoverflow.com/a/8461182/131930 –

+0

这是我不清楚是否有“睡眠”你的意思是屏保/显示器关闭(应该没有效果?)或暂停。除非你正在开发像视频播放器这样的交互式应用程序,否则如果你的应用程序混乱了我的能量设置,我会认为它是不好的风格。 –

+0

@FrankOsterfeld如果应用程序任务要执行耗时的计算,那么它是保持mac暂停或至少有一个选项来防止这种情况的可行理由。 –

回答

2

通过了Qt 5.2 API进行彻底搜查后,似乎Qt不提供任何功能改变能量设置(这样既适用于Mac,也没有任何其他的操作系统)。我还没有发现任何迹象表明它也在路线图上。

使用苹果的Objective-C的API为Mac OSX可能的解决方案,可以发现here(感谢,@Kuba)。

在Windows上,电源设置可以处理使用SetThreadExecutionState功能(参见this question,C#)。

+0

除了'SetThreadExecutionState'不能防止显示屏关闭。 –

3

这方面有两个方面:

  1. 强制睡眠如果用户打算在系统睡觉,而你妨碍了它,你的用户很可能骂你。强制睡眠也是能量和热量管理的一部分,对于防止数据丢失和避免硬件破坏并减轻可能的火灾风险至关重要。

    当我关上笔记本电脑的盖子时,最好睡觉,如果我找到一个试图绕过它的应用程序,最好是免费的,否则我会打电话给我的信用卡公司以收取退款费用。这很简单,我希望很容易理解为什么会这样。

  2. 空闲休眠你想要做什么并不是防止系统进入到所有睡觉,但只禁用闲置的睡眠。

禁用空闲睡眠在this answer中涵盖。

+1

感谢您的澄清。这种感觉在我的脑海中是有意义的,但我不知道它的正确名词。 尽管您链接到的答案对本地Mac编程很有用,但它是Objective-C解决方案,而不是Qt/C++解决方案。 – Yellow

+0

@Yellow没有Qt/C++解决方案。您可以从Qt项目中自由使用Objective-C/C++。 –

0

如果您想避免使用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); 
相关问题