2008-12-26 11 views
11

Ich habe einen langen Prozess der Zahlenverarbeitung, der die Vorteile des OpenGL-Offscreen-Renderings ausnutzt. Alles funktioniert gut, aber wenn ich es alleine verlasse, während ich ein Sandwich mache, würde ich normalerweise feststellen, dass es abgestürzt ist, während ich weg war.
Ich konnte feststellen, dass der Absturz sehr nahe an dem Moment auftritt Der Laptop, den ich benutze, beschließt, den Bildschirm auszuschalten, um Energie zu sparen. Der Absturz selbst ist innerhalb der NVIDIA-DLLs, also gibt es keine Hoffnung zu wissen, was vor sich geht.Off-Screen-Rendering, wenn Laptop Bildschirm herunterfährt?

Die offensichtliche Lösung ist, die Energieverwaltungsfunktion auszuschalten, die den Bildschirm und die Videokarte ausschaltet, aber ich suche nach etwas benutzerfreundlicherem. Gibt es eine Möglichkeit, dies programmatisch zu tun?
Ich weiß, dass es eine SETI @ home-Implementierung gibt, die die Vorteile der GPU-Verarbeitung nutzt. Wie hält es die Grafikkarte davon ab, in den Ruhezustand zu gehen?

+1

Warum markieren Sie dies? Scheint wie eine gültige Frage. +1, um dem feigen Drive-by entgegenzuwirken. –

Antwort

9

Ich bin mir nicht sicher, in welchem ​​Betriebssystem Sie sind, aber windows sends a message, dass es um einen neuen Energiezustand geht. Sie können darauf warten und dann entweder mit der Verarbeitung auf der CPU beginnen oder die Anforderung verweigern, in einen leistungsärmeren Zustand zu wechseln.

+0

Ja, Windows. sehr cool, Danke! – shoosh

8

Zum Vorteil von Linux-Benutzern, die auf ein ähnliches Problem stoßen, dachte ich, ich würde hinzufügen, dass Sie ähnliche Benachrichtigungen erhalten und Leistungsstatusänderungen unter Verwendung der DBUS API verhindern können. Ein Beispiel-Script in Python, von der Verbindung genommen, Netzzustandsänderung zu hemmen:

#!/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

Laut MSDN gibt es eine API, die eine Anwendung ermöglicht es Windows zu sagen, dass es immer noch funktioniert und dass Windows nicht gehen sollte um zu schlafen oder das Display auszuschalten.

Die Funktion heißt SetThreadExecutionState (MSDN). Es funktioniert für mich, mit den Flaggen ES_SYSTEM_REQUIRED und ES_CONTINUOUS.

Beachten Sie jedoch, dass die Verwendung dieser Funktion nicht dazu führt, dass der Bildschirmschoner nicht ausgeführt wird, was Ihre OpenGL-Anwendung beeinträchtigen kann, wenn der Bildschirmschoner auch OpenGL (oder Direct3D) verwendet.

+0

Das Ausschalten des Displays ist * nicht * genauso wie das Aktivieren des Bildschirmschoners. Das sind zwei unabhängige Einstellungen. -1 – 0xC0000022L