Что нового

TimeEvent - Событие по дате и времени

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AutoIt: 3.3.8.1
Версия: 1.2

Категория: Дата и время

Описание: Библиотека позволяющая регистрировать событие, вызываемое в определённую дату и/или время.

Код/Пример:
Код:
#include <GUIConstantsEx.au3>
#include <DateTimeConstants.au3>
#include <Array.au3>
#include "TimeEvent.au3"

$hGUI = GUICreate('TimeEvent Example', 250, 200)

GUICtrlCreateLabel('Event Name:', 20, 20)
$iEventName_Input = GUICtrlCreateInput('MyEvent', 100, 18, 100, 20)

GUICtrlCreateLabel('Time:', 20, 70)
GUICtrlSetFont(-1, 9, 800)
$iEventTime_Time = GUICtrlCreateDate('', 100, 68, 100, 22, BitOR($DTS_TIMEFORMAT, $DTS_UPDOWN))
GUICtrlSendMsg($iEventTime_Time, $DTM_SETFORMATW, 0, 'HH' & $s_TE_Time_Sep & 'mm' & $s_TE_Time_Sep & 'ss')

GUICtrlCreateLabel('Date:', 20, 100)
GUICtrlSetFont(-1, 9, 800)
$iEventTime_Date = GUICtrlCreateDate('', 100, 98, 100, 20, $DTS_SHORTDATEFORMAT)
GUICtrlSendMsg($iEventTime_Date, $DTM_SETFORMATW, 0, 'dd' & $s_TE_Date_Sep & 'MM' & $s_TE_Date_Sep & 'yyyy')

$iSet_Bttn = GUICtrlCreateButton('Set event', 20, 170, 70, 20)

GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iSet_Bttn
			$sEvent = GUICtrlRead($iEventName_Input)
			$sDate = GUICtrlRead($iEventTime_Date)
			$sTime = GUICtrlRead($iEventTime_Time)
			
			_TimeEvent_Add($sEvent, $sDate, $sTime, '_MyEvent_Proc', 'Some extra data', True)
			
			$aEvents = _TimeEvent_GetEvents()
			
			_ArrayDisplay($aEvents, 'Events count: ' & $aEvents[0])
			$aAddedData = _TimeEvent_GetData($aEvents[1])
			$sData = ''
			
			For $i = 0 To UBound($aAddedData)-1
				$sData &= $aAddedData[$i] & @CRLF
			Next
			
			MsgBox(64, 'Event [' & $aEvents[1] & '] data', $sData, 0, $hGUI)
			
			$aNextEvent = _TimeEvent_GetNextEvent()
			
			If Not @error Then
				_ArrayDisplay($aNextEvent, 'Next event')
			Else
				MsgBox(48, 'Attention', 'No upcoming events', 0, $hGUI)
			EndIf
	EndSwitch
WEnd

Func _MyEvent_Proc($aParams)
	Local $sEvent = $aParams[0]
	Local $sDate = $aParams[1]
	Local $sTime = $aParams[2]
	Local $sParams = $aParams[3]
	Local $bRemove = $aParams[4]
	
	MsgBox(64, 'Event [' & $sEvent & '] fired', _
		'Event fired at: ' & $sDate & ' ' & $sTime & @CRLF & _
		'With params: ' & $sParams & @CRLF & _
		'Event should be removed: ' & $bRemove, 0, $hGUI)
	
	If $bRemove Then
		;Some actions when the event should be removed (the remove of the event itself handeled by the TimeEvent UDF)
		MsgBox(48, 'Attention', 'Event removed', 0, $hGUI)
	EndIf
EndFunc

Файл: TimeEvent.zip

История версий:
1.2
+ [ЭКСПЕРИМЕНТАЛЬНО] Добавлена функция _TimeEvent_EnableSync, позволяет включить или выключить синхронизацию времени событий (с системным временем).
+ Добавлена функция _TimeEvent_GetEventDates для получения корректных дат события.
+ Добавлена проверка на валидность даты в функцию _TimeEvent_Add.
* Изменён метод возврата @error в функции _TimeEvent_Add (см. документацию к функции).
* Исправлена функция _TimeEvent_GetNextEvent.
* Исправлена проблема с повторяющимся вызовом функции события.

1.1
+ Добавлена функция _TimeEvent_GetEvents для получения списка всех событий.
+ Добавлена функция _TimeEvent_GetNextEvent для получения ближайшего события.
- Убрана функция _TimeEvent_GetCount, число событий теперь можно получить используя новую функцию _TimeEvent_GetEvents.
* Обновлена документация к функциям.

1.0
Первая публичная версия

Источник: autoit-script.ru
Автор(ы): G.Sandler (CreatoR)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
CreatoR,
ИМХО, добавить бы проверку на корректность даты - времени (если они уже в прошлом).
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Будет работать, если сeйчас 10:40 а мне нужно что бы стабатывала в 9:30? Должна по логике сработать завтра?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
madmasles [?]
добавить бы проверку на корректность даты - времени (если они уже в прошлом).
Да, неплохая мысль.

inververs [?]
Будет работать, если сeйчас 10:40 а мне нужно что бы стабатывала в 9:30? Должна по логике сработать завтра?
Если не указывать дату (-1), тогда да.

Позже выложу утилиту-будильник, где интенсивно используется данная библиотека (она собственно для этой утилиты и была написана :smile:).
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
ИМХО, добавить еще возможность срабатывания, если например, время синхронизировалось, изменилось, или как то по другому ушло вперед, например на 1 час. Например, событие устанавливаешь в 10:56 на 11:00, а в 10:57 вдруг(неожиданно правда :smile: ) время синхронизируется через интернет и оказывается, что сейчас уже 11:03, и функция не срабатывает.
Казалось бы, маловероятный сценарий такой рассинхронизации, но бывает 2 раза в год, не в каждой стране правда, перевод часов на час туда или обратно.


Добавлено:
Сообщение автоматически объединено:

CreatoR
Инетесно, я как раз вчера искал функцию срабатывающую в определенное время, а сегодня у вас есть то что мне подойдет :smile:. Совпадение.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление...

1.1
+ Добавлена функция _TimeEvent_GetEvents для получения списка всех событий.
+ Добавлена функция _TimeEvent_GetNextEvent для получения ближайшего события.
- Убрана функция _TimeEvent_GetCount, число событий теперь можно получить используя новую функцию _TimeEvent_GetEvents.
* Обновлена документация к функциям.


inververs [?]
добавить еще возможность срабатывания, если например, время синхронизировалось, изменилось, или как то по другому ушло вперед, например на 1 час
Тоже неплохая идея, нужно ещё подумать как это корректно сделать.
Реализация примерно такая: следим за системным временем (хук или что то подобное), и если оно изменилось, делаем вычисления во всех записанных событиях...
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Когда меняется время, то рассылается бродкаст сообщене WM_TIMECHANGE
Это может поможет?


Добавлено:
Сообщение автоматически объединено:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$RUN = True
$hForm = GUICreate('')

GUIRegisterMsg($WM_TIMECHANGE,'WM_TIMECHANGE')

While $RUN
	Sleep(100)
WEnd

Func WM_TIMECHANGE($hWnd, $Msg, $wParam, $lParam)
	ConsoleWrite('Время изменилось. Выход' & @LF)
	$RUN = False
	Return $GUI_RUNDEFMSG
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
inververs [?]
Когда меняется время, то рассылается бродкаст сообщене WM_TIMECHANGE
Если не ошибаюсь, то это сообщение приходит только при ручной смене даты и времени.
И к тому же, нужно ещё каким то образом узнать старое время, чтобы вычислить куда переводить время у созданных событий.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Хранишь в событиях время окончания таймера, как только время переведено, пересчитываешь, сколько осталось ждать и перезапускаешь таймер с новым временем. Так?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Вот так можно решить задачу:

Код:
#Include <Date.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

Global $sPrev_DateTime

$hForm = GUICreate('System Time Changed Example')

AdlibRegister('_SetPrevDateTime', 1000)
GUIRegisterMsg($WM_TIMECHANGE, 'WM_TIMECHANGE')

GUISetState()

Do
Until GUIGetMsg() = -3

Func _SetPrevDateTime()
	$sPrev_DateTime = _NowCalc()
EndFunc

Func WM_TIMECHANGE($hWnd, $iMsg, $wParam, $lParam)
	Static $iTIMECHANGE
	
	If Not $iTIMECHANGE Then
		Switch $hWnd
			Case $hForm
				ConsoleWrite('Previous date & time: ' & $sPrev_DateTime & @LF)
				ConsoleWrite('Current date & time: ' & _NowCalc() & @LF)
		EndSwitch
		
		$iTIMECHANGE = 1
	Else
		$iTIMECHANGE = 0
	EndIf
	
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление:

1.2
+ [ЭКСПЕРИМЕНТАЛЬНО] Добавлена функция _TimeEvent_EnableSync, позволяет включить или выключить синхронизацию времени событий (с системным временем). По умолчанию отключено.
+ Добавлена функция _TimeEvent_GetEventDates для получения корректных дат события.
+ Добавлена проверка на валидность даты в функцию _TimeEvent_Add.
* Изменён метод возврата @error в функции _TimeEvent_Add (см. документацию к функции).
* Исправлена функция _TimeEvent_GetNextEvent.
* Исправлена проблема с повторяющимся вызовом функции события.
 
Верх