Отключение рендеринга экрана, когда ноутбук выключает экран? - PullRequest
11 голосов
/ 26 декабря 2008

У меня длительный процесс обработки чисел, который использует довольно мало возможностей OpenGL закадрового рендеринга. Все работает хорошо, но когда я оставляю его работать самостоятельно, пока я готовлю бутерброд, я обычно обнаруживаю, что он разбился, пока меня не было.
Мне удалось определить, что сбой произошел очень близко к моменту. Используемый ноутбук решает выключить экран для экономии энергии. Сам сбой хорошо внутри dll NVIDIA, поэтому нет никакой надежды узнать, что происходит.

Очевидное решение - отключить функцию управления питанием, которая отключает экран и видеокарту, но я ищу что-то более удобное для пользователя. Есть ли способ сделать это программно?
Я знаю, что есть реализация SETI @ home, которая использует преимущества обработки GPU. Как это удерживает видеокарту от засыпания?

Ответы [ 3 ]

9 голосов
/ 26 декабря 2008

Я не уверен, в какой ОС вы работаете, но windows отправляет сообщение , что он собирается перейти в новое состояние питания. Вы можете прослушать это, а затем либо начать обработку на ЦП, либо отклонить запрос на переход в состояние пониженного энергопотребления.

8 голосов
/ 27 декабря 2008

Для пользователей 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)
0 голосов
/ 02 февраля 2010

Согласно MSDN, существует API, который позволяет приложению сообщать Windows, что оно все еще работает и что Windows не должна переходить в спящий режим или выключать дисплей.

Функция называется SetThreadExecutionState ( MSDN ). Это работает для меня, используя флаги ES_SYSTEM_REQUIRED и ES_CONTINUOUS.

Обратите внимание, однако, что использование этой функции не останавливает работу заставки, которая может помешать вашему приложению OpenGL, если заставка также использует OpenGL (или Direct3D).

...