1 (изменено: ThrowSum, 2016-01-18 15:24:54)

Тема: AHK: Будильник

По сути нужно создать подобие будильника - например при достижении времени в 12:00 запускается определенная программа.
Подскажите как реализовать проще и правильнее.

2

Re: AHK: Будильник

taskschd.msc /s без всякого AHK.

3

Re: AHK: Будильник

ThrowSum, ознакомьтесь с этой темой, отредактируйте заголовок.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Будильник

Flasher пишет:

taskschd.msc /s без всякого AHK.

Ну если бы просто нужно было запустить программу, я бы не интересовался AutoHotkey. Остальные действия мне более-менее понятны. А вот как отследить такое событие как время, например 12:05 не знаю. Предположения есть, запустить цикл, проверять переменную с временем, но опять же я практически не знаю AHK. Хотелось бы совета как это делают или ссылку на рабочий пример.
Боюсь, что у меня будут какие-то бесконечные циклы, которые загрузят процессор под завязку.

teadrinker пишет:

ThrowSum, ознакомьтесь с этой темой, отредактируйте заголовок.

Поправил.

5

Re: AHK: Будильник

target_time = 1205   ; 12:05
target := A_YYYY A_MM A_DD target_time 00
if (target < A_Now)
   EnvAdd, target, 1, d
EnvSub, target, %A_Now%, Seconds
Sleep, % target * 1000
msgbox Alarm!

6

Re: AHK: Будильник

Malcev, огромное спасибо за помощь, именно так я и представлял этот будильник, простой и без циклов.

Сначала все вообще устроило, но возникла проблема - я начал тестировать таймер и вижу, что срабатывает не всегда в 12:05 например, а иногда секундой позже. Вот здесь я затупил, подумал, что это из-за лагов каких, нагрузки компа, поставил -300мс на Sleep, тогда он начала срабатывать иногда на 12:04:59 с хвостиком. Подумал, что на большем отрезке будет и больше погрешность. Потом пришло в голову - задавая Sleep мы ведь не учитываем миллисекунды! То есть все зависит когда я запущу этот скрипт, отсюда и получается точность в +\- секунду.

Вот первое, что пришло в голову, это работает, но ужасно тупо решено. Пока A_MSec будет равно нулю проходят секунд 15, задержку Sleep меньше 10 вроде бессмысленно ставить. Ну и задача запустить таймер в 0 миллисекунд, когда они не будут влиять на точность срабатывания в секундах.
Как правильно это сделать?

while (A_MSec != 0)
    {
	Sleep, 10
    }

target_time = 120500   ; 12:05
...

7

Re: AHK: Будильник

Можно для большей точности отнимать от sleep A_Msec, а как точнее не подскажу.

target_time = 1205   ; 12:05
target := A_YYYY A_MM A_DD target_time 00
if (target < A_Now)
   EnvAdd, target, 1, d
EnvSub, target, %A_Now%, Seconds
Sleep, % target * 1000 - A_Msec
msgbox % A_Hour ":" A_Min ":" A_Sec ":" A_MSec 

8

Re: AHK: Будильник

ThrowSum пишет:

Ну если бы просто нужно было запустить программу, я бы не интересовался AutoHotkey.

Это не объясняет то, чем планировщик в данном случае не годится. Запускать оттуда сценарий/скрипт никто не мешает. Taskend грузится в трей по умолчанию. Зачем дополнительно нагружать трей ещё одним процессом?

9 (изменено: ThrowSum, 2016-02-06 23:17:18)

Re: AHK: Будильник

Malcev пишет:

Можно для большей точности отнимать от sleep A_Msec, а как точнее не подскажу.

Sleep, % target * 1000 - A_Msec

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

Flasher пишет:

Зачем дополнительно нагружать трей ещё одним процессом?

Я хочу лучше разобраться в AHK на примерах, все таки он дает достаточно широкие возможности.