Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/32: Рейтинг темы: голосов - 32, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59

Управление энергосбережением (Power Management)

05.12.2011, 21:17. Показов 6401. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как сделать так,чтобы система не переходила в спящий режим пока работает поток! заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.12.2011, 21:17
Ответы с готовыми решениями:

Управление энергосбережением (Power Management)
Разработка программы для управления операционной системой: Управление энергосбережением (Power Management). Я так понимаю это нужно...

Где в Ами-биосе найти Power management?
Подскажите где в Ами-биосе найти Power management? Мать AsRock P43DE Нужен пункт Aspi Suspend Type S3 Нужно чтоб кулеры отключались в...

Управление приложением с кнопки power на LCD мониторе
Прошу прощения, но пока не знаю куда писать. Есть ли возможность сделать так чтобы при выключении монитора с кнопки Power на лицевой...

34
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
19.01.2012, 08:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kate_miss Посмотреть сообщение
но это только 2 функции одна ловит сообщение --другая обрабатывает????
а куда вот это---
А это никуда. Оно уже есть, в функции MainWinProc. Вот оно!
C
1
2
  case WM_POWERBROADCAST:
   return BROADCAST_QUERY_DENY;
1
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59
19.01.2012, 08:45  [ТС]
И еще вопрос!!!! Задача поставлена так----- пока работает поток, программа не должна перейти в спящий режим-----тогда надо ли создавать рабочий поток??? или программа будет видеть какие-то другие потоки на компе???
0
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
19.01.2012, 08:52
О каком потоке речь?
0
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59
19.01.2012, 09:01  [ТС]
надо по условию --- о каком потоке сама не могу понять((((

Добавлено через 6 минут
пока она не работает
при компиляциии вот такая ошибка
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
C:\Users\Desktop\1\Debug\1.exe : fatal error LNK1120: 1 unresolved externals
0
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59
19.01.2012, 10:17  [ТС]
все разобралась!!!!!!!!!!!!!
вот только один вопрос остался.......когда система перейдет в спящий режим???
0
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
19.01.2012, 14:36
Видимо, когда закончит свою работы поток. Ещё, наверное, систему настроить надо, чтоб автоматом в спящий режим переходила.

Цитата Сообщение от kate_miss Посмотреть сообщение
пока работает поток, программа не должна перейти в спящий режим-----тогда надо ли создавать рабочий поток??? или программа будет видеть какие-то другие потоки на компе???
Видимо, всё таки надо создавать...
1
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
19.01.2012, 16:51
Интересный у вас код организовался
Цитата Сообщение от kate_miss Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR cmdline,int ss) 
{
 MSG msg;
 while (GetMessage(&msg,NULL,0,0)>0) {
 TranslateMessage(&msg); 
 DispatchMessage(&msg); 
 } 
 return msg.wParam;
}
LRESULT CALLBACK MainWinProc(HWND hw,UINT msg,WPARAM wp,LPARAM lp) 
{
 switch (msg)
{
 case WM_CREATE:
 return TRUE;
 case WM_COMMAND:
 return FALSE;
 case WM_POWERBROADCAST:
 return BROADCAST_QUERY_DENY;
 case WM_DESTROY:
 PostQuitMessage(0);
 return TRUE;
 default: 
 return DefWindowProc(hw,msg,wp,lp);
 }
}
Вы бы проверили, вызывается ли функция MainWinProc в вашей программе хоть один раз. То что вы в WinMain организовали цикл извлечения сообщений, еще не значит, что сообщения будут обрабатываться в MainWinProc

И еще раз, так не правильно:
C
1
2
3
4
5
MSG msg;
 while (GetMessage(&msg,NULL,0,0)>0) {
 TranslateMessage(&msg); 
 DispatchMessage(&msg); 
 }
Правильно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MSG msg;
BOOL ret
while ((ret = GetMessage(&msg,NULL,0,0)))
{
  if (ret == -1)
  {
    // Обрабатываем ошибку, например, так (просто завершаем приложение с кодом -1)
    return -1;
  }
  else
  {
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
  }
}
1
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
19.01.2012, 17:14
Цитата Сообщение от bigredcat Посмотреть сообщение
Вы бы проверили, вызывается ли функция MainWinProc в вашей программе хоть один раз. То что вы в WinMain организовали цикл извлечения сообщений, еще не значит, что сообщения будут обрабатываться в MainWinProc
Так это, видимо, кусок кода, а не вся программа. Естественно, надо ещё окно создать.

Цитата Сообщение от bigredcat Посмотреть сообщение
Правильно так:
И в чём разница, если ошибку обрабатывать не собираемся? О_о Зато код компактней.
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
19.01.2012, 17:56
Цитата Сообщение от kisssko Посмотреть сообщение
И в чём разница, если ошибку обрабатывать не собираемся?
В том, что kate_miss уже узнала о том, как это правильно писать и даже попыталась переписать, но не совсем удачно: while (GetMessage(&msg,NULL,0,0)>0). И получается, что она знает, как нужно написать правильно, но вы советуете сознательно делать иначе. На мой взгляд это вырабатывает не очень хорошую привычку.
1
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
20.01.2012, 00:30
Цитата Сообщение от bigredcat Посмотреть сообщение
В том, что kate_miss уже узнала о том, как это правильно писать и даже попыталась переписать, но не совсем удачно: while (GetMessage(&msg,NULL,0,0)>0). И получается, что она знает, как нужно написать правильно, но вы советуете сознательно делать иначе. На мой взгляд это вырабатывает не очень хорошую привычку.
Изначально, это я написал.
C
1
while (GetMessage(&msg,NULL,0,0)>0)
1
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59
20.01.2012, 17:20  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <windows.h>
#include "powrprof.h"
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    MessageBox(NULL, TEXT("Уходим в спящий режим"),TEXT("hibernate"), 0); 
    //SetSystemPowerState(true,true); так компилит, но не засыпает
    //SetSuspendState(0,1,1); так не компилит.
    //как я поняла нужно модифицировать "powrprof.h" под "C" extern. 
    //я его изменила, но он все равно не компилит. "powrprof.h" находится в папке проекта, а <powrprof.h> находится
    //в библиотеках с++ и значит не измененный.
  return 0;
}

как вы думаете такой вариант может быть решением данной задачи
0
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59
21.01.2012, 00:01  [ТС]
спасибо всем за помощь, но этот подход к решению задачи не верен

вот какой алгоритм

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

помогите реализовать
0
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
21.01.2012, 00:03
Но это же только MessageBox О_о

Добавлено через 2 минуты
Цитата Сообщение от kate_miss Посмотреть сообщение
Пока поток работает, система не должна перейти в спящий режим. пока Вами созданный поток работает - система не переходит в спящий режим. Потом - Вас не должно интересовать, что будет с системой, в задании этот момент не оговаривается.. Поток не должен давать возможность перейти в режим suspend.
Мы так и поняли. Ну, там почти правильно, просто немножко доделать.
1
1 / 1 / 0
Регистрация: 02.11.2009
Сообщений: 59
21.01.2012, 00:05  [ТС]
Мы так и поняли. Ну, там почти правильно, просто немножко доделать.
помогите пожалуйста...а чего не хватает....msdn уже по теме перечитала.....ничего не соображаю, сдавать после завтра....а я "не в зуб ногой"

препод-ль сказал что не сложно --- а для меня сложнее не придумали.....
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
22.01.2012, 18:49
Цитата Сообщение от kate_miss Посмотреть сообщение
спасибо всем за помощь, но этот подход к решению задачи не верен
Этот подход не то, что бы совсем уж неверный, но точно более сложный.
Вообще, в MSDN написано, что Windows XP и более ранние версии могут возвращать BROADCAST_QUERY_DENY, но приложения не должны этого делать. Для предотвращения перехода в режим пониженного энергопотребления в Windows Vista рекомедуют использовать SetThreadExecutionState.
Вот выдержки.
Windows XP and earlier: The system broadcasts a PBT_APMQUERYSUSPEND event to request permission to suspend system operation. The system expects each application and driver to determine whether the requested event should occur and to return TRUE if it occurs, or return BROADCAST_QUERY_DENY otherwise. Applications should not deny this request. If an application denies this request, the system broadcasts a PBT_APMQUERYSUSPENDFAILED event. This event notifies applications and drivers to continue operation as usual.

To prevent the system from transitioning to a low-power state in Windows Vista, an application must call SetThreadExecutionState to inform the system that it is in use.

Но функция SetThreadExecutionState работает и в Windows XP и в Windows 2000. Так что ее можно и нужно использовать.

Цитата Сообщение от kate_miss Посмотреть сообщение
препод-ль сказал что не сложно
Действительно, все очень просто, почти как Hello World. Там кода, если отбросить все не нужное, и десяти строчек не будет. И вам сразу указали на SetThreadExecutionState.

Пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <windows.h>
#include <locale.h>
#include <iostream>
 
using namespace std;
 
DWORD WINAPI ThreadFunc(PVOID pParam)
{
//  // Сбрасываем счетчик таймера для перехода в ждущий/спящий режим, дисплей может отключиться.
//  SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
//  // Сбрасываем счетчик таймера для режима отключения дисплея, система может перейти в ждущий/спящий режим.
//  SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);
    // Сбрасываем счетчики таймероов для перехода в ждущий/спящий режим и для режима отключения дисплея.
    SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
    cout << "Запуск потока ThreadFunc\n";
 
    // Цикл на 2 минуты.
    for (int i = 0; i < 12; i++)
    {
        Sleep(10000);
        cout << "Прошло: " << (10 * (i + 1)) << " с\n";
    }
 
    cout << "Завершение потока ThreadFunc\n";
    // Начинаем отсчет сброшенных таймеров схемы энергосбережения заново.
    SetThreadExecutionState(ES_CONTINUOUS);
 
    return 0;
}
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    // Цикл на 1 минуту.
    for (int i = 0; i < 6; i++)
    {
        Sleep(10000);
        cout << "Прошло: " << (10 * (i + 1)) << " с\n";
    }
 
    HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);
 
    // Очень длительный цикл.
    int i = 0;
    while (++i)
    {
        Sleep(10000);
        cout << "Прошло: " << (10 * i) << " с\n";
    }
 
    system("PAUSE");
    return 0;
}


Проверял на Windows XP x32 и Windows 7 x64. Устанавливал отключение дисплея 1 мин., переход в спящий режим 2 мин.
Функция SetThreadExecutionState работает немного по разному в этих ОС. В комментариях так, как в Windows 7. В Windows XP при использовании ES_SYSTEM_REQUIRED дисплей не отключается все-равно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2012, 18:49

Как подключить HDD Led, Power Led+, Power Led -, Power sw, reset sw на мат. плате ga-b75-d3v rev.1
Весь вопрос в теме.

Подключение Power SW, HDD LED, Reset SW, Power Led+, Power LED- на материнке Foxconn
Доброго времени суток. Вот в чем проблема, уже день пытаюсь найти мануал или хоть что нибудь, что бы подключить Power SW, HDD LED, Reset...

Подключение кабелей Power SW, HDD LED, Reset SW, Power Led+, Power LED-
Доброго времени суток. Вот в чем проблема, уже день пытаюсь найти мануал или хоть что нибудь, что бы подключить Power SW, HDD LED, Reset...

Excel и Power Query подгрузка картинок и отображение в Power View
Добрый день. Осваиваю Power Query, Power Pivot и Power View в эксель (2016 версия). Пробую подгрузить данные, как по данному...

Power consumption(Gpu power tdp) 75-80% норма ли это?
Здравствуйте ,столкнулся со следующей странностью.Недавно приобрел себе новую видеокарту gtx 1060 6gb и решил ее проверить в Furmark и OCCT...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru