SetThreadExecutionState не работает при вызове из службы Windows - PullRequest
9 голосов
/ 03 мая 2011

Я хочу предотвратить переход системы в спящий / спящий режим из службы Windows.Я вызываю SetThreadExecutionState функцию, чтобы сделать это.Но, похоже, не имеет никакого эффекта.Я просто хочу знать, будет ли функция SetThreadExecutionState для служб Windows.Если нет, то какие будут альтернативные пути к этому.

Ниже приведен код C #, который я использую.Я звоню по Onstart методу обслуживания.

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint SetThreadExecutionState(EXECUTION_STATE esFlags);
private void KeepAlive() 
{
     SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS)
}

Ответы [ 2 ]

10 голосов
/ 03 мая 2011

Вызов SetThreadExecutionState без ES_CONTINUOUS просто сбрасывает таймер простоя;чтобы держать дисплей или систему в рабочем состоянии, поток должен периодически вызывать SetThreadExecutionState.

( source )

Вам необходимо вызывать эту функцию каждый сейчаса потом.Это не огонь и забыл.

7 голосов
/ 26 декабря 2014

SetThreadExecutionState действителен только для потока, который его вызывает.Если он вызывается в рабочем потоке, даже с ES_CONTINUOUS, после того, как рабочий поток мертв, настройка больше не действительна, и затем снова будет включена заставка.

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

Так что если вы вызываете SetThreadExecutionState в вашем основном потоке, например, в потоке пользовательского интерфейса в клиентских приложениях, вам не нужен таймер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...