我有一个冗长的数字运算过程,它充分利用了OpenGL屏幕外渲染的功能。这一切都运作良好但是当我自己离开它去做三明治的时候,我常常会发现它在我不在的时候就崩溃了。
我能够确定崩溃发生的时间非常接近我正在使用的笔记本电脑决定关闭屏幕以节省能源。崩溃本身就在NVIDIA dlls里面,所以没有希望知道发生了什么。
显而易见的解决方案是关闭电源管理功能,关闭屏幕和视频卡,但我正在寻找更友好的用户。 有没有办法以编程方式执行此操作? 我知道有一个利用GPU处理的SETI @ home实现。它如何防止视频卡进入睡眠状态?
答案 0 :(得分:9)
我不确定你在使用什么操作系统,但windows sends a message它即将进入新的电源状态。您可以监听,然后开始在CPU上处理或拒绝进入低功耗状态的请求。
答案 1 :(得分:8)
为了Linux用户遇到类似问题的好处,我想我会补充一点,您可以使用DBUS API获取类似的通知并禁止电源状态更改。 Python中的一个示例脚本,取自链接,用于禁止电源状态更改:
#!/usr/bin/python
import dbus
import time
bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
devobj = bus.get_object('org.freedesktop.PowerManagement',
'/org/freedesktop/PowerManagement')
dev = dbus.Interface (devobj, "org.freedesktop.PowerManagement.Inhibit")
cookie = dev.Inhibit('Nautilus', 'Copying files from /media/SANVOL')
time.sleep(10)
dev.UnInhibit(cookie)
答案 2 :(得分:0)
根据MSDN,有一个API允许应用程序告诉Windows它仍在工作,并且Windows不应该进入休眠状态或关闭显示器。
该函数名为SetThreadExecutionState
(MSDN)。它适用于我,使用标记ES_SYSTEM_REQUIRED
和ES_CONTINUOUS
。
但请注意,使用此功能不会阻止屏幕保护程序运行,如果屏幕保护程序也使用OpenGL(或者Direct3D),则可能会干扰您的OpenGL应用程序。