2012-01-04 27 views
9

Mi programa realiza una tarea en el espacio libre del disco duro. La tarea es bastante larga, demora de 1 a 2 horas.¿Cómo se puede evitar programáticamente Windows desde el disco duro?

El problema es que en la computadora portátil, el disco duro se puede apagar después de unos minutos cuando el usuario está inactivo.

¿Cómo impido programáticamente que Windows desde el disco duro se apague (apague)?

+4

Establezca manualmente un plan de energía diferente desde el panel de control. Eliminaría un programa que cambia el plan de energía a mis espaldas. – kludg

+10

¿La computadora apaga el disco mientras está en uso? Eso realmente no suena bien para mí. ¿Estás seguro? –

+0

En resumen, Windows no apagará el disco durante una escritura de disco activa, pero el OP no está haciendo una lectura de archivo o escritura de archivo adecuada, por lo que Windows puede suspender el disco o toda la computadora. El OP puede estar equivocando un poco el problema. –

Respuesta

9

Para evitar que el sistema ingrese al modo inactivo, puede intentar usar la función SetThreadExecutionState. Esta función informa al sistema que la aplicación está en uso y le permite especificar los requisitos de ejecución del hilo. El uso puede ser así, pero no estoy seguro si esto afecta también la energía del disco temporizador de cuenta atrás:

type 
    EXECUTION_STATE = DWORD; 

const 
    ES_SYSTEM_REQUIRED = $00000001; 
    ES_DISPLAY_REQUIRED = $00000002; 
    ES_USER_PRESENT = $00000004; 
    ES_AWAYMODE_REQUIRED = $00000040; 
    ES_CONTINUOUS = $80000000; 

function SetThreadExecutionState(esFlags: EXECUTION_STATE): EXECUTION_STATE; 
    stdcall; external 'kernel32.dll' name 'SetThreadExecutionState'; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED or 
    ES_AWAYMODE_REQUIRED) <> 0 then 
    try 
    // execute your long running task here 
    finally 
    SetThreadExecutionState(ES_CONTINUOUS); 
    end; 
end; 

O también está disponible el nuevo conjunto de funciones PowerCreateRequest, PowerSetRequest y PowerClearRequest diseñados para Windows 7, pero la documentación es confusa y no he encontrado ningún ejemplo de su uso en este momento.

O puede modificar la configuración de energía mediante las funciones PowerWriteACValueIndex o PowerWriteDCValueIndex con el subgrupo de configuraciones de energía GUID_DISK_SUBGROUP.

+0

Gracias. ¡Eso es todo! – user382591

+0

De todos modos, ¿qué ha utilizado, el ejemplo de código de la publicación? ¿Significa que 'SetThreadExecutionState' también afecta al reinicio del temporizador de apagado del disco? La documentación de MSDN es bastante débil (y me gustaría eliminar la nota sobre _untested_), es por eso que estoy preguntando :) Gracias – TLama

+1

Lo probé. Eso funciona como un encanto ... SetThreadExecutionState afecta también el reinicio del temporizador de apagado del disco. – user382591

5

Windows no permite que las aplicaciones deshabiliten los cambios de control de alimentación, ya que las aplicaciones defectuosas estaban causando el drenaje de las baterías. Consulte http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

Puede recibir una notificación cuando el estado de la alimentación del sistema esté a punto de cambiarse. Ver WM_POWERBROADCAST Messages.

+1

Pero puede decirle al sistema que necesita un tiempo adicional para su tarea (por ejemplo, cuando está viendo la película, debe decirle al sistema que no desea apagar la pantalla), y en mi humilde opinión eso es lo que es (como dijo TLama en su comentario) la función 'SetThreadExecutionState' para. Entonces, de hecho, estás rompiendo el plan de energía. –

+0

@Martin, como mencionaste al mirar la película, puedes usar ['SetThreadExecutionState'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29. aspx) con el indicador 'ES_DISPLAY_REQUIRED' para mantener su pantalla encendida. El problema es que no estoy seguro (y no tengo una máquina de prueba) si esta función es aplicable también para el temporizador inactivo del disco. – TLama

Cuestiones relacionadas