Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие Reset кампа, реально ли ? 
:(
    Опции темы
12usver12
Дата 4.7.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



вообщем бывают случаи когда юзеры вырубают камп  при помощи reset пк, соответсвенно программа не может правильно сохранить настройки даже в случае отлова выключение компьютера... реально ли отловить reset ?  теоретически ведь когда зажимаешь клавишу выключения пк, комп вырубатся не сразу а через пару секунд, может какие-то сообщения посылаются в этом случае...
PM MAIL   Вверх
DarkProg
Дата 4.7.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Цитата(12usver12 @  4.7.2010,  15:42 Найти цитируемый пост)
теоретически ведь когда зажимаешь клавишу выключения пк, комп вырубатся не сразу а через пару секунд, может какие-то сообщения посылаются в этом случае... 

Не правильно отписали заголовок темы.

В данном случае отрабатывается процедура выключения компьютера, просто прерывание приходит от железа а не програмно когда пуск->выключить.

Если так то вы можете попробовать отловить это сообщение, но остановить его вряд ли сможете, инициировать можете есть такая вещь кажись shutdown или power off(я не помню название, но помню что это стандартные WinAPI и поисковиком найдёте как их юзать)

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


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
12usver12
Дата 4.7.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



то есть в рамках программирования под windows (WinApi и другие api уровнем ниже из ntdll ) это отловить нереально ?
PM MAIL   Вверх
DarkProg
Дата 4.7.2010, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Цитата(12usver12 @  4.7.2010,  19:32 Найти цитируемый пост)
то есть в рамках программирования под windows (WinApi и другие api уровнем ниже из ntdll ) это отловить нереально ? 

нажатие кнопки reset на панели компьютера не создавая ничего аппаратного нельзя


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
DarkProg
Дата 5.7.2010, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



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

P.S. мысль пришла около двух утра smile


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
icecrashldr
Дата 8.7.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Reset = Апаратное прирывание, отловить нельзя.



PM MAIL WWW   Вверх
Alexeis
Дата 8.7.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(12usver12 @  4.7.2010,  14:42 Найти цитируемый пост)
соответсвенно программа не может правильно сохранить настройки даже в случае отлова выключение компьютера

  Неплохо сохранять настройки каждый раз при их изменении. Если данных действительно много (больше 1 Мб) и изменяются часто (чаще чем раз в 1-2с), то можно завести таймер и сохранять с определенным интервалом.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
OlegSK
Дата 17.7.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Если проблема возникает из-за того, что кто-то из юзверей ПЕРЕЗАГРУЖАЕТ комп кнопкой Reset, то возможно имеет смысл отключить эту кнопку от мат. платы в их компах. Если речь все же идет именно о выключении компа с помощью короткого нажатия кнопки Power (а не Reset), то событие такого выключения можно отловить в программе и сохранить необходимые данные; копать нужно в сторону сообщения WM_QUERYENDSESSION, которое, если меня не подводит память, рассылается всем открытым приложениям при корректном выключении компа. Если из обработчика этого сообщения вернуть нулевое значение, то выключение компа будет продолжено, а если вернуть единицу то выключение компа будет прервано (правда при этом некоторые приложения будут уже закрыты).

Добавлено через 3 минуты и 3 секунды
Кстати, если кто-то из юзверей может выключить комп с помощью продолжительного нажатия на кнопку Power (которое нельзя обработать программно), то возможно имеет смысл и ее отключить от мат. платы и организовать вкл./выкл. с клавиатуры компа.
PM MAIL   Вверх
OlegSK
Дата 17.7.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Также, если меня память не подводит, стоит копать в сторону сообщения: WM_POWERBROADCAST -> BT_APMQUERYSUSPEND.
PM MAIL   Вверх
12usver12
Дата 17.7.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



Цитата

 если меня не подводит память, рассылается всем открытым приложениям при корректном выключении компа

всем оконным приложениям,  хм тут впринцте можно посмотреть http://msdn.microsoft.com/en-us/library/aa373247(VS.85).aspx нужно попробывать 
PM MAIL   Вверх
Dem_max
Дата 18.7.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Ничего не придет, придет если только рубануть питание на компе.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
OlegSK
Дата 19.7.2010, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Dem_max
Цитата
Ничего не придет, придет если только рубануть питание на компе.

Ага, если рубануть питание, то прейдет северный пушной зверек к несохраненным данным... AFAIK все как раз наоборот; - если нажать кнопку Reset, или просто обесточить комп, то никаких сообщений программе не прейдет; собственно, по этому такое выключение является не корректным, и может привести к повреждению данных... С другой стороны, при корректном выключении компа, инициированном через меню Пуск или кратковременным нажатием кнопки Power (на компах, поддерживающих ATX, а их сейчас подавляющее большинство), всем работающим приложениям (по крайней мере, - оконным) рассылаются соответствующие сообщения. Можно даже провести элементарный эксперимент: запустите WordPad и наберите в нем некоторый текст, затем, не сохраняя этот текст, инициируйте корректное выключение компа. Будьте уверены, что WordPad получит соответствующее сообщение от ОС и поинтересуется у вас: хотите ли вы сохранить набранный текст? Кстати, если в ответ на этот запрос нажать отмену, то выключение компа будет прервано. Вот элементарная демонстрация возможностей, которые имеют программы обрабатывающие эти сообщения...

З.Ы: Я говорю о приложениях работающих под Windows (как минимум начиная с WinXP). За другие ОС говорить не могу, т.к. не в курсе...


Это сообщение отредактировал(а) OlegSK - 19.7.2010, 06:01
PM MAIL   Вверх
OlegSK
Дата 22.7.2010, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Похоже что консольные программы тоже могут получать сообщения о корректном выключении компа. Вот код-демка:
Код

#include <stdio.h>
#include <conio.h>
#include <windows.h>

HANDLE hEvent = 0;

BOOL WINAPI Handler(
  DWORD dwCtrlType  
)
{
  if (!hEvent)
    return FALSE;

  switch (dwCtrlType)
  {
    case CTRL_LOGOFF_EVENT:
      printf ("User logoff");
      SetEvent (hEvent);
      break;
    case CTRL_SHUTDOWN_EVENT:
      printf ("System shutdown");
      SetEvent (hEvent);
      break;
  }

  return TRUE;
}

int main(int argc, char* argv[])
{
  hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
  SetConsoleCtrlHandler (Handler, TRUE);

  if (g_hEvent)
  {  
    printf ("Waiting for the window to close...\n");
    WaitForSingleObject (hEvent, INFINITE);
    CloseHandle (g_hEvent);
  }
  else
    printf ("Error creating event\n");

  printf ("\nPress any key to exit!");
  getch ();

  SetConsoleCtrlHandler (Handler, FALSE);
    return 0;
}


З.Ы: Сам его не проверял...

Это сообщение отредактировал(а) OlegSK - 22.7.2010, 08:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.