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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие выключения компьютора 
:(
    Опции темы
lemax
Дата 7.1.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Процесс находится в постоянном цикле с элементом Sleep(360000)
Код

for(;;)
{
...
sleep(sleepTime);
...
}


не дает выключить компьютор.
Помогите простым примерчиком решить эту проблему.

Может что-то такое http://forum.vingrad.ru/faq/topic-156310.html только на С++
PM MAIL   Вверх
JackYF
Дата 7.1.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(lemax @  7.1.2008,  13:43 Найти цитируемый пост)
не дает выключить компьютор.

подробнее.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
lemax
Дата 7.1.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(JackYF @ 7.1.2008,  15:05)
Цитата(lemax @  7.1.2008,  13:43 Найти цитируемый пост)
не дает выключить компьютор.

подробнее.

Сообщение "Процесс такой-то не отвечает" (и варианты убить или не убить его). По истечении 15 сек ничего не происходит. Компьютор ждет, пока этот процесс не убьют  smile 
PM MAIL   Вверх
powerfox
Дата 7.1.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



Не знаю, как в винде, но, по идее, каждый процесс при выключении получает сигнал от операционной систему. Нужно его перехватить и выполнить break.


--------------------
user posted image
PM WWW   Вверх
lemax
Дата 7.1.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(powerfox @ 7.1.2008,  15:29)
Не знаю, как в винде, но, по идее, каждый процесс при выключении получает сигнал от операционной систему. Нужно его перехватить и выполнить break.

примерчик бы хотелось. Перехвата процессом без окна 
PM MAIL   Вверх
powerfox
Дата 7.1.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



Цитата(lemax @  7.1.2008,  16:33 Найти цитируемый пост)
примерчик бы хотелось. Перехвата процессом без окна  

В смысле? По идее, обычные С++ исключения. Наличие окна не влияет на получение сигнала. Просто надо знать, какие исключения ловить. Я с Windows API не знаком, но из того, что видел, вам нужно погуглить о исключениях завершения приложения.

Добавлено через 4 минуты и 50 секунд
Код

try{

for(;;)
{
...
sleep(sleepTime);
...
}

catch (Exception exception)
   {
   HandleException(exception);
   }

}


Как-то так, наверное. Ищите нужный тип исключения.


--------------------
user posted image
PM WWW   Вверх
jonie
Дата 7.1.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



создайте окно и используйте его, например во втором потоке. Окно будет уведомлено, далее вы в первом потоке делаете например не цикл бесконечный, а цикл до Event-а... и вырубаетесь по нему...
пример в аттаче.
Цитата

По идее, обычные С++ исключения
неверно. ОС и С++ исключения не связаны (нуу если не говорить о "фишках" компляторов типа VC...)

ладно, признаю, мы тупые.
Код

#include <windows.h>

BOOL WINAPI EventHandler(DWORD event)
{
    switch(event)
    {
        case CTRL_C_EVENT:
        break;

        case CTRL_BREAK_EVENT:
        break;

        case CTRL_CLOSE_EVENT:
            // process any cleanup code and terminate
            return FALSE;
        break;

        case CTRL_LOGOFF_EVENT:
        break;

        case CTRL_SHUTDOWN_EVENT:
        break;
    }

    return TRUE;
}

void main()
{
    if (SetConsoleCtrlHandler(
    (PHANDLER_ROUTINE)EventHandler,TRUE)==FALSE)
    {
        return; // failed to install
    }

    while(1)
    {
    }


Это сообщение отредактировал(а) jonie - 7.1.2008, 16:25

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  winSample.rar 11,01 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lemax
Дата 7.1.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



SetConsoleCtrlHandler

Приложение не консольное  smile 

Это сообщение отредактировал(а) lemax - 7.1.2008, 18:31
PM MAIL   Вверх
jonie
Дата 7.1.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



так чем плох вариант создания окна ? пример я давал... ну скройте его и нет проблем имхо..
чтобы терминировала винда без показа окна можно воспользоваться SetProcessShutDownParameters
но я не считаю это верным подходом...

Это сообщение отредактировал(а) jonie - 7.1.2008, 19:55


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lemax
Дата 7.1.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(jonie @ 7.1.2008,  19:47)
так чем плох вариант создания окна ? пример я давал... ну скройте его и нет проблем имхо..

Если бы я в этом разбирался я бы мигом это сделал. Но пока я вожусь с новой темой.
Если вдруг появится примерчик (процесс все события обрабатывает как DefWindowProc()) - буду только рад  smile
PM MAIL   Вверх
jonie
Дата 7.1.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а что выше во вложении уже не пример оО ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MAKCim
Дата 7.1.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



или я чего-то не понял
что, обычный процесс может заблокировать выключение системы?  smile 
я в шоке


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 8.1.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(MAKCim @  7.1.2008,  22:30 Найти цитируемый пост)
что, обычный процесс может заблокировать выключение системы?  smile 
я в шоке 

ну вообще-то я думал, что нет... система обычно убивает процесс через n секунд после того, как он перестаёт отвечать на запросы.

Добавлено через 17 секунд
в смысле, при попытке убить ждёт данное время.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
lemax
Дата 8.1.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(jonie @ 7.1.2008,  22:00)
а что выше во вложении уже не пример оО ?

Семь бед - один ответ  smile http://www.ict.edu.ru/ft/004249/cpp_p4.pdf

Проблемку не решил. Но похоже это поможет.

jonie. Спасибо за примеры.

Добавлено через 10 минут и 38 секунд
Цитата(MAKCim @ 7.1.2008,  23:30)
или я чего-то не понял
что, обычный процесс может заблокировать выключение системы?  smile 
я в шоке

Я сам в шоке. Но баг из программы надо как-то убрать (сунули код- вот и парюсь).
А причина бага - это только догадки.

Это сообщение отредактировал(а) lemax - 8.1.2008, 00:22
PM MAIL   Вверх
salexs
Дата 8.1.2008, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а если так....
include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <vdmdbg.h>
#include <tchar.h>
#include <process.h> 
BOOL MySystemSleep()
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tkp;

  BOOL fResult;

  if (!OpenProcessToken(GetCurrentProcess(),
       TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
     return FALSE;

  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
       &tkp.Privileges[0].Luid);

  tkp.PrivilegeCount = 1;
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
     (PTOKEN_PRIVILEGES) NULL, 0);

  if (GetLastError() != ERROR_SUCCESS)
     return FALSE;

  fResult = SetSystemPowerState(FALSE,TRUE);

  if (!fResult)
     return FALSE;

  tkp.Privileges[0].Attributes = 0;
  AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
       (PTOKEN_PRIVILEGES) NULL, 0);

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.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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