Standby Mode로 진입 실패에 대한 원인

Standby Mode로의 진입이 실패하는 이유는 다양합니다만, 아래와 같은 경우가 일반적입니다. 아래 내용을 참조하시기 바랍니다.

Standby mode로 진입하여 현재 상태의 스냅샷을 받은 후 저장하는 것은 다음과 같은 조건이 되었을 때에만 가능합니다. 즉, 마지막 10분 동안 아래와 같은 일들이 일어나지 않을 경우에만 시스템이 Idle 상태로 판단하게 됩니다. 이 때부터 Standby로 설정한 시간만큼 기다렸다가 Standby 모드로 진입시도를 하게 됩니다.

1. Mouse / Keyboard와 같은 사용자 입력이 없는 경우,

2. CPU와 Disk 사용수준이 10%를 넘어서지 않을 경우,

3. 시스템이 Battery Power로 실행되고 있지 않고 AC Power로 실행되는 경우,

4. Slide Show와 같은 Presentation 프로그램이 실행되지 않은 경우,

5. 3D Screen Save 등이 Enable되어 있지 않은 경우,

CPU와 Disk 사용 수준이 10%를 넘어서는 작업은 아래와 같은 주기적인 작업들이 있을 수 있습니다.

1. SMS Scanning

2. Group Policy Refresh

3. AV Scanning / Disk Fragmentation

4. 기타 형식의 Network Scanning

그리고, 프로그램을 만들 때 SetThreadExecutionState 함수에 ES_SYSTEM_REQUIRED 플래그를 설정하였다면 Standby Mode로 진입이 되지 않습니다. 이 플래그는 시스템 Idle Timer를 리셋하여 시스템이 항상 실행중인 것처럼 보이게 합니다. 따라서 Standby Mode로는 진입이 되지 않습니다. 보통 장시간 실행되는 프로그램의 경우 이 함수를 사용하여 Idle Timer를 리셋한다면 Standby Mode로의 진입에 대한 걱정 없이 실행할 수 있도록 할 수가 있습니다.

SetThreadExecutionState Function

https://msdn.microsoft.com/en-us/library/aa373208(VS.85).aspx

사용 방법은 아래와 같습니다.

// Television recording is beginning. Enable away mode and prevent

// the sleep idle time-out.

SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);

//

// Wait until recording is complete...

//

// Clear EXECUTION_STATE flags to disable away mode and allow the system to idle to sleep normally.

SetThreadExecutionState(ES_CONTINUOUS);

일반 프로그램의 경우 위와 같은 함수를 사용하여 프로그래밍을 하였다면 Standby Mode로 진입하지 않게 됩니다. 하지만 이 내용은 프로그램 개발사에서 확인해 주지 않는 한 확인하기가 쉽지 않습니다. 보통 이와 같은 내용을 Spec 으로 표시하지 않으니까요.