Перехватить сообщение об изменении питания ноута

 

  Прошу заранее прощения, что вопрос лишь косвенно относиться к темам трейдинга, но если это не очень сложно, то прошу ответить: если возможность либо из Планировщика заданий, либо из самого MQL5 поймать событие перехода питания ноутбука (Fujitsu siemens, Vista houme) от адаптера на батарею. Чего-то в инете тяжело ищется и как-то плохо понятно. А среди стандартных событий журнала не нашёл такого.  

 
Erm955 писал(а)  :

  Прошу заранее прощения, что вопрос лишь косвенно относиться к темам трейдинга, но если это не очень сложно, то прошу ответить: если возможность либо из Планировщика заданий, либо из самого MQL5 поймать событие перехода питания ноутбука (Fujitsu siemens, Vista houme) от адаптера на батарею. Чего-то в инете тяжело ищется и как-то плохо понятно. А среди стандартных событий журнала не нашёл такого.  

Насколько я помню в журнал системы переходы на питание от батарей и от AC не пишутся. Ни от Kernel-Power ни от Power-Troubleshooter. Поэтому использовать TaskSheduler не получится.

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

Можно  также написать библиотеку и подключить ее к вашему скрипту на MQL , из которого и опрашивать текущий режим. Думаю что получить уведомление не делая опроса не получится так как для этого Вам потребуется иметь отдельный поток который будет висть на вэйте евента , а такого в MQL вроде нет (???) . Но кажется есть функция которая вызывается по таймеру, в которой можно и полить было-ли полученно уведомление в вашу внешнюю библиотеку или нет. Почитать про систему уведомлений можно тут - http://msdn.microsoft.com/en-us/library/aa373195(VS.85).aspx

 

**

А в счем сообственно сама проблема? 

RegisterPowerSettingNotification function (Windows)
  • msdn.microsoft.com
Registers the application to receive power setting notifications for the specific power setting event. Syntax Parameters hRecipient [in] Handle indicating where the power setting notifications are to be sent. For interactive applications, the Flags parameter should be zero, and the hRecipient parameter should be a window handle. For services...
 

А в счем сообственно сама проблема? 

 

 Да никикой--всё от скуки! Тестера всё нет, а у меня вся работа на нём. Советники давно написаны и сутками болтаются на ноутах. Иногда ночью надо дать возможность программе коррктно завершиться, после отключения сети.

А так, спасибо! Вижу, что двигался в правильном направлении (просто думал, что проще можно).  

 
Erm955:

 

 Да никикой--всё от скуки! Тестера всё нет, а у меня вся работа на нём. Советники давно написаны и сутками болтаются на ноутах. Иногда ночью надо дать возможность программе коррктно завершиться, после отключения сети.

А так, спасибо! Вижу, что двигался в правильном направлении (просто думал, что проще можно).  

 

Ага... не за что :)

Но вот еще пара слов про это - Ну если нужно как-то особенно "проще", хотя  на самом деле помоему ничего сложного тут нет и не очень понятно как же иначе что-то получить в программе вообще.

 

Ну если например нужно посто запустить программу там, или выполнить какие-то действия, то можно воспользоваться Windows Script Host и там обрабатывать WMI евенты. Ну сообственно тут тоже "проще"-сть ,  относительна так как там программировать придется тоже, а среды для отладки/разработки вообще никакой. Но зато скрипты типа батников.

 

SProgrammer

Но вот еще пара слов про это - Ну если нужно как-то особенно "проще", хотя  на самом деле помоему ничего сложного тут нет и не очень понятно как же иначе что-то получить в программе вообще.

 

 Видимо, мой уровень несколько ниже, чем вы предполагаете. Чтоб было понятно, то я пишу только на MQL и когда-то давно писал на PL/1, Fortran, Pascal и т.д. Чувствуете разницу? Но тем не менее задача зацепила и надо её решить. Потому позволю себе несколько вопросов в понятной мне терминологии.

 1. Как я понимаю в ОС имеются встроенные библиотеки по работе с событиями питания компьютера.

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

 3. Далее необходимо в программе на MQL5 подсоединитья к этой библиотеки и в OnTimer() опрашивать функцию на предмет работы от батареи. 

Поправте, если это неверное рассуждение (похоже, нельзя напрямую обратиться к системной библиотке?)

Вот информация по вашей ссылке (с автопереводом).  Может покажете, что здесь мне нужно. 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

 

Регистрация для энергетики события

Заявления можно лучше адаптировать свое поведение к текущей государственной власти компьютера путем регистрации за власть событий. Использование RegisterPowerSettingNotification функции, приложения могут получать PBT_POWERSETTINGCHANGE уведомления либо с WM_POWERBROADCAST Сообщения, отправленные в окно (для интерактивных приложений), либо через HandlerEx Функция обратного вызова зарегистрированы RegisterServiceCtrlHandlerEx (для сервисных приложений). LPARAM Параметр WM_POWERBROADCAST сообщение или lpEventData Параметр направлен в HandlerEx обратная функция является указателем POWERBROADCAST_SETTING структуры.

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

GUID_POWERSCHEME_PERSONALITY - 245d8541-3943-4422-B025-13A7-84F679B7

Уведомляет каждый раз, когда активные изменения схемы сила личности. Вся власть схемах карт к одному из этих личностей. Данные член GUID , что свидетельствует о новой активной личности схема власти.

GUID_MIN_POWER_SAVINGS - 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

Высокая производительность - схема предназначена для обеспечения максимальной производительности за счет экономии потребления энергии.

GUID_MAX_POWER_SAVINGS a1841308-3541-4fab-bc81-f71556f20b4a

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

GUID_TYPICAL_POWER_SAVINGS - 381b4222-f694-41f0-9685-ff5bb260df2e

Автоматически - схема предназначена для автоматического баланса производительности и экономии энергопотребления.

 

GUID_ACDC_POWER_SOURCE - 5d3e9a59-e9D5-4b00-a6bd-ff34ff516548

Уведомляет каждый раз, когда изменения в системе источника питания. Данные член DWORD со значениями из SYSTEM_POWER_CONDITION нумерация, что указывает на текущий источник питания.

PoAc (ноль)

Компьютер на питание от источника переменного тока (или аналогичное оборудование, такое как ноутбук питание от 12V автомобильный адаптер).

PoDc (одна)

Компьютер питается от источника питания бортовых батарей.

PoHot (два)

Компьютер питается от краткосрочных источнику питания такие устройства, как ИБП.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 
RegisterPowerSettingNotification function (Windows)
  • msdn.microsoft.com
Registers the application to receive power setting notifications for the specific power setting event. Syntax Parameters hRecipient [in] Handle indicating where the power setting notifications are to be sent. For interactive applications, the Flags parameter should be zero, and the hRecipient parameter should be a window handle. For services...
 
Erm955:

 Видимо, мой уровень несколько ниже, чем вы предполагаете. Чтоб было понятно, то я пишу только на MQL и когда-то давно писал на PL/1, Fortran, Pascal и т.д. Чувствуете разницу? Но тем не менее задача зацепила и надо её решить. Потому позволю себе несколько вопросов в понятной мне терминологии.

 1. Как я понимаю в ОС имеются встроенные библиотеки по работе с событиями питания компьютера.

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

 3. Далее необходимо в программе на MQL5 подсоединитья к этой библиотеки и в OnTimer() опрашивать функцию на предмет работы от батареи. 

Поправте, если это неверное рассуждение (похоже, нельзя напрямую обратиться к системной библиотке?)

Знаете, а я ведь тоже писал на PL/1 и Фортране, и на паскале. :)

PL/1 отличный язык, кстати. А фортран так даже был рабочим языком для системных программистов на PDP где я начинал как системщик. Про терминологию скажу  так - если Вы владели на должном уровне в те времена, то по сути ничего не изменилось. Раньше DLL назывались "разделяемый библиотеки" которые загружались в память системы и разные программы могли их используя совместно, "разделяя" между собой. Суть библиотеки DLL состоит в том, что она "отображается" в адресное пространство  всех процессов которые ее "загрузили" . Причем она с системе присутствует в единственном экземпляре, и ее отображение далается в режиме так называемого CopyOnWrite, то есть как только какой-то из процессов который ее использует сделает запись в ее адресное пространство она "копируется" ему и запись разрешается. Последнее замечание очень поверхностно и все гораздо сложнее. Но в целом Вы можете просто считать что владеете этой библиотекой эксклюзивно. Так проше, и если не уходить в дебри то вполне сойдет. Просто там есть куча ньюансов которые тут помоему излагать излишне. DLL это по сути просто программа, у которой не одна точка входа как у просто программы ( хотя и у программы их может быть несколько ) , ну вот не одна, а много - весь их список хранится в так называемом "экспорте" . А у программы ( и у DLL тоже ) есть так называемые "импорты" это то что  программе надо для работы. Там перечисленны DLL, котрые загружаются еще до того как создание процесса будет завершено. И есть например какйю-то DLL найти не удается то создание процесса обламывается, ну то есть он не создастся. Обычно к каждой DLL есть маленькая статическая библитека ( статическая библиотека это просто набор обьектных модулей, он выглядит в виде файла с расширением ".LIB" ). Эта  маленькая библиотека имеет внутри себя набор таких как-бы переходников, для функций , и при обращении к какой либо функции происходит загрузка уже самой DLL. Ну а если DLL уже загруженна  и отображена в адресное пространство просса, то происходит просто переход по тому адресу который имеет эта библиотесная функция в этой DLL.

То есть для работы с DLL надо либо в ручную загружать ее либо иметь такую соответсвующую ей ".lib".

Программировать сейчас принято на C или C++, и обычно все пользуются Visual Stdio от микрософт. Она даже бесплатная и скачивается прямо с сайта майкрософт. Там в месте с ней идет полный набор для программирования и редактор например и компилятор и все в остновном такие  статические библиотеки для работы с операционной системой.

Для того чтобы использовать в MQL внешние продрограммы написанные на других языках Вам надо будет сдалать свою DLL и импортировать ее в свою программу на MQL-е, как это сделать написанно в документации. В этой совей DLL-библиотке Вам надо будет сделать такую функцию которая бы  возвращала в MQL истину если например компютер работате от батарей. Так же Вам надо будет в ней видимо создать отдельный поток который зарегистрирует обработчик системного события по питанию и при получении такого эвента ( события ) будте созранять то последнее получнееное состояние "типа питания" что бы Вы могли из MQL программы через ту специальную импортируемую функцию получать тип питания. Вызывать эту функцию из MQL наверное проше всего из таймерной "процедуры", ну той функции которая вызывается по таймеру - OnTimer. Таким образом делая "опрос" "поля" ( do polling ) опрашивая состяние системы Вы уже сможете делать на основании того какое питание сейчас то что Вам надо.

Если Вас еще не напугало то что надо  будет сделать, то советую Вам все таки по разбираться. Тут совсем нет ничего сложного. Есть масса статей и на русском на эту тему про DLL-и и по просто "как начать программировтать на Си"

Но на самом деле все тут очень просто, :) Ну если на глаз оченивать то строчек 200-300 на С или С++ и еще 50 на MQL. 

 

Но чт окасается Вашего вопроса, с пунктами, :) Я поэтому так и ответил, что сказать что Вы не правильно что-то написали, не могу, НО то что тот путь которым Вы хотите пойти для совсем уж проффесионалов. Начните лучше с того что заведите полное сервисное окружение, и никаких имен библиотек "узнавать" не надо будет, это все нписанно в документации и делается просто включение нужных файлов в проект.

 

 26

SProgrammer  2010.02.09 21:42 2010.02.09 21:42:45

 

 Спасибо за изчерпывающий ответ. Говорят нет худа без добра, но отсутствие Тестера подвигло на углубленное изучение других языков (С++). Я понял о чём вы написали, так как скачал Visual Studio 2008 и нашёл соответсвующие статьи в интернете. Так что не дай бог Тестер появится раньше времени и опять всё заброшу (шучу!)

 Кстаи, событие по изменеию питания компа получил через утилиту Vista Battery ...., которая снимает дополнительную панель с раб. стола и создает соотв. событие в журнале, ну далее действует планировщик....  Это не совсем то, но для начала пойдёт.