Orion9

|
Posted: Tue Feb 18, 2025 14:01 Post subject: |
|
|
Loopback wrote: | Насчет лучший не знаю, можно, конечно и с имеющимися функциями написать, учитывая переполнение, но считаться трафик будет от запуска тотала. |
Да, я думал об этом. Именно поэтому решил делать через WMI, так как нужен полный объем трафика. Но надо будет ещё подумать, что делать с интерфейсом. А пока - простая реализация планировщика заданий на Autorun!
Окно монитора заданий вызывается при наведении на заголовок.
 usercmd.ini Code: | [em_update_wdx_menu]
cmd=90000
param=
[em_change_lang_ru]
cmd=OPENLANGUAGEFILE
param=WCMD_RUS.LNG
[em_change_lang_en]
cmd=OPENLANGUAGEFILE
param=WCMD_ENG.LNG |
 Schedule.ini Code: | ; ключ - команда задания
; значение - интервал выполнения задания (не меньше 20 сек.)
; - задержка перед первым выполнением (не меньше 10 сек.)
; - количество повторений задания, включая первое выполнение (не меньше одного)
; - ссообщение в заголовке
[Schedule]
em_update_wdx_menu=180,10,2,Updating Wdx Array
em_change_lang_en=20,15,3,Changing Language En
em_change_lang_en=20,,Changing Language En
em_change_lang_ru=30,25,10,Changing Language Ru
em_change_lang_ru=30,5,10,Testing
|
 Test.aucfg Code: | RegisterCommand 90000 ScheduleTest1
Func ScheduleTest1(lParam)
MsgBox("Выполнение команды по расписанию")
EndFunc
Global Div = " > "
Global TitleSeconds = 0, TitleBreak = false
Global JustTitle = WinGetText(), VarTitle = JustTitle
Global IniFile = %COMMANDER_PATH% & "\Ini\Schedule.ini"
Global aUserCmd = List(), aUserInterval = List()
Global aUserDelay = List(), aUserRepeat = List(), aUserMsg = List()
Global aUserDone = List(), aUserProx = List()
ControlSetHint /F /D:300 /H:2 0 "GetSchedule"
LoadSchedule()
RunThread ThreadSchedule
Func ThreadSchedule()
While 1
VarTitle = JustTitle & Div & "Memory: " & GetMemStats(0) & "% CPU: " & GetCPUUsage() & "%"
UpdateSchedule()
WinSetText(VarTitle)
Sleep(1000)
TitleSeconds += 1
Wend
EndFunc
Func LoadSchedule()
Local bad, item
Local sect, j, aSect = List()
# чтение секции
sect = IniReadSection(IniFile, "Schedule")
aSect.Text = sect
# сброс массивов
aUserCmd.Count = 0
aUserInterval.Count = 0
aUserDelay.Count = 0
aUserRepeat.Count = 0
aUserMsg.Count = 0
aUserDone.Count = 0
aUserProx.Count = 0
# в секции нет записей
If aSect.Count = 0 Then Return
# заполнение массивов
For j = 0 To aSect.Count - 1
If StrPos(aSect[j], "=") > 0 Then
bad = false
# ключ
key = StrPart(aSect[j], "=", 1)
# значение
val = StrPart(aSect[j], "=", 2)
# em_команда задания
aUserCmd.Add(key)
# интервал выполнения задания
item = StrPart(val, ",", 1)
If Not IsInt(item) Or item < 20 Then
bad = true
item = "-"
EndIf
aUserInterval.Add(item)
aUserProx.Add(item)
# задержка перед первым выполнением
item = StrPart(val, ",", 2)
If Not IsInt(item) Or item < 10 Then
bad = true
item = "-"
EndIf
aUserDelay.Add(item)
# количество вылолненных
aUserDone.Add(0)
# количество повторений задания
item = StrPart(val, ",", 3)
If Not IsInt(item) Or item < 0 Then
bad = true
item = "-"
EndIf
aUserRepeat.Add(item)
# сообщение в заголовок
item = StrPart(val, ",", 4)
If item = "" Then
item = key
EndIf
# проверка корректности записи
If bad Then
item = "# Incorrect"
aUserInterval[j] = "-"
aUserProx[j] = "-"
aUserDelay[j] = "-"
aUserRepeat[j] = "-"
EndIf
aUserMsg.Add(item)
EndIf
Next
Free(aSect)
EndFunc
Func GetSchedule()
Local txt, j, state
txt = "Виртуальная память: " & GetMemStats(1) & auCRLF
for i = 3 to 6
#txt &= "GetMemStats(" & i & ") = " & StrFormat("%.0f", GetMemStats(i) / 1048576) & auCRLF
next
txt &= "Планировщик заданий, всего циклов: " & TitleSeconds & auCRLF
txt &= "-----------------------------------------------------------------------------------------" & auCRLF
txt &= "Задание №" & auTAB & "Команда / Сообщение" & auTAB & "Инт." & auTAB & "Перв." & auTAB & _
"Повт." & auTAB & "Выпол." & auTAB & "След." & auTAB & "Состоян." & auCRLF
txt &= "-----------------------------------------------------------------------------------------" & auCRLF
For j = 0 To aUserCmd.Count - 1
state = (aUserDone[j] = aUserRepeat[j] ? "Завершено" : "Работает")
If aUserInterval[j] = "-" Then state = "-"
txt &= "Задание №" & j+1 & auTAB & StrFormat("%-20.20s", aUserMsg[j]) & auTAB & aUserInterval[j] & auTAB & _
aUserDelay[j] & auTAB & aUserRepeat[j] & auTAB & aUserDone[j] & auTAB & aUserProx[j] & auTAB & state & auCRLF
Next
# стиль подсказки
SetHintParam("csh", "Font", 9, "Consolas")
#SetHintParam("csh", "Font", 9, "Arial")
SetHintParam("csh", "BackColor", 0x00000000)
SetHintParam("csh", "Text", 0xFFFFFF)
# вернуть предыдущий стиль через 1 сек.
RunThread HintParamReload
# текст подсказки
Return StrTrim(txt)
EndFunc
Func HintParamReload()
Sleep(1000)
SetHintParam("csh", "Reload")
EndFunc
Func UpdateSchedule()
Local prox, j
Local send, msg = false
For j = 0 To aUserCmd.Count - 1
# флаг выполнения задания
send = false
# некорректная запись
If aUserRepeat[j] = "-" Then Continue
# задание завершено
If aUserDone[j] = aUserRepeat[j] Then Continue
# задание ещё не выполнялось
If aUserDone[j] = 0 Then
# задержка перед первым выролнением
If aUserDelay[j] - TitleSeconds < 3 Then
# локальный флаг
msg = true
# глобальный флаг
TitleBreak = true
# сообщение в заголовке
VarTitle = Div & "Usercmd" & Div & aUserMsg[j] & "..."
EndIf
If aUserDelay[j] = TitleSeconds Then send = true
# задание ранее выполнялось
Else
# проверка состояния счётчика
If aUserProx[j] = "-" Then Continue
# отсчет до следующего выполнения
prox = aUserProx[j] - 1
# близость выполнения
If prox < 3 Then
msg = true
TitleBreak = true
VarTitle = Div & "Usercmd" & Div & aUserMsg[j] & "..."
Endif
# выполнение задания
If prox = 0 Then
# сброс счётчика к новому интервалу
prox = aUserInterval[j]
# флаг выполнения задания
send = true
Endif
aUserProx[j] = prox
EndIf
# флаг выполнения
If send Then
# количество выполненных
aUserDone[j] = aUserDone[j] + 1
# все повторы выполнены
If aUserDone[j] = aUserRepeat[j] Then aUserProx[j] = "-"
# посылка команды задания
CommandExec(aUserCmd[j])
EndIf
Next
# смена сообщения в заголовке
If msg Then
VarTitle = JustTitle & VarTitle
Endif
EndFunc
|
|
|