2012-01-04 11 views
9

Il mio programma esegue un'attività sullo spazio libero del disco rigido. L'attività è piuttosto lunga, , ci vogliono 1-2 ore.Come impedire a Windows di ruotare verso il basso l'unità del disco rigido?

Il problema è che sul laptop il disco rigido può essere spento dopo pochi minuti quando l'utente è inattivo.

Come si impedisce a livello di codice di Windows di ruotare verso il basso il disco rigido (spegnimento)?

+4

Impostare manualmente un piano di alimentazione diverso dal pannello di controllo. Vorrei eliminare un programma che cambia il piano di alimentazione alle mie spalle. – kludg

+10

Il computer spegne il disco mentre è in uso? Non mi sembra davvero giusto. Sei sicuro? –

+0

In breve, Windows non spegnerà il disco durante la scrittura di un disco attivo, ma l'OP non sta eseguendo una corretta lettura di file o scrittura di file e pertanto Windows potrebbe sospendere il disco o l'intero computer. L'OP potrebbe essere leggermente errato nel descrivere il problema. –

risposta

9

Per impedire al sistema di entrare in modalità di inattività, provare a utilizzare la funzione SetThreadExecutionState. Questa funzione informa il sistema che l'applicazione è in uso e consente di specificare i requisiti di esecuzione del thread. L'utilizzo può essere così, ma non sono sicuro se questo riguarda anche il potere del disco temporizzatore giù:

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 c'è a disposizione anche la nuova serie di funzioni PowerCreateRequest, PowerSetRequest e PowerClearRequest progettati per Windows 7, ma la documentazione è confusa e non ho trovato alcun esempio del loro utilizzo in questo momento.

Oppure è possibile modificare le impostazioni di alimentazione tramite le funzioni PowerWriteACValueIndex o PowerWriteDCValueIndex con il sottogruppo GUID_DISK_SUBGROUP delle impostazioni di alimentazione.

+0

Grazie. Questo è tutto! – user382591

+0

Prego, comunque che cosa hai usato, l'esempio di codice del post? Significa che "SetThreadExecutionState" influisce anche sul reset del timer di spegnimento del disco? La documentazione MSDN è abbastanza debole (e vorrei eliminare la nota su _untested_), è per questo che sto chiedendo :) Grazie – TLama

+1

l'ho provato. Funziona come un fascino ... SetThreadExecutionState influisce anche sul ripristino del timer di spegnimento del disco. – user382591

5

Windows non consente alle applicazioni di disabilitare i cambiamenti di controllo dell'alimentazione, poiché le applicazioni con il buggy causavano il drenaggio delle batterie. Vedi http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

È possibile ricevere una notifica quando lo stato di alimentazione del sistema sta per essere modificato. Vedi WM_POWERBROADCAST Messages.

+1

Ma potresti dire al sistema che hai bisogno di un tempo extra per il tuo compito (ad esempio quando stai guardando il film devi dire al sistema che non vuoi spegnere il display), e IMHO è quello che è (come dice TLama nel suo commento) la funzione 'SetThreadExecutionState' per. Quindi in realtà stai rompendo il piano di alimentazione. –

+0

@Martin, come hai detto guardando il film puoi usare il ['SetThreadExecutionState'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29. aspx) con il flag 'ES_DISPLAY_REQUIRED' per mantenere acceso il display. Il problema è che non sono sicuro (e non ho una macchina di prova) se questa funzione è applicabile anche per il timer di inattività del disco. – TLama

Problemi correlati