Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
ChimMAG
Каждую минуту запускается следующий скрипт:
Код: Выделить всё
// ---------------------------------------
// Скрипт просто пишет в файл время последнего своего запуска

var
 StartTime:double;
 wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond: word;
 iUIN,LastUIN,nUIN,mmSek,sDel:integer;
begin
 StartTime:=Now;
 DecodeDateTime(StartTime, wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond);
 if (wHour=0) and (wMinute=0) then
 begin
    sDel:=DeleteFile('C:\Programs\LastTimeRun.txt');
    AddLineToFile(inttostr(wDay)+'.'+inttostr(wMonth)+'.'+inttostr(wYear)+' '+inttostr(wHour)+':'+inttostr(wMinute)+':'+inttostr(wSecond)+' - результат удаления файла: '+IntToStr(sDel),'C:\Programs\ResultDel.txt',0);
 end;
 AddLineToFile(inttostr(wDay)+'.'+inttostr(wMonth)+'.'+inttostr(wYear)+' '+inttostr(wHour)+':'+inttostr(wMinute)+':'+inttostr(wSecond),'C:\Programs\LastTimeRun.txt',0);
 end.


А вот содержимое файла LastTimeRun.txt в момент смены даты:
Код: Выделить всё
9.6.2022 23:57:0
9.6.2022 23:58:0
9.6.2022 23:59:0
10.6.2022 0:2:0
10.6.2022 0:3:0
10.6.2022 0:4:0
10.6.2022 0:5:0

При этом файл вообще ResultDel.txt не создаётся.
Вообще-то я не должен видеть строки от 9.6.2022. Но их вижу. Более того - я вижу пропуск в 3 минуты! Что такое, почему? Можно, конечно, поправить время удаления файла (параметр wMinute) на третью минуту, но это уже костыль.
Аватара пользователя
Алексей Пикуров
Специфика выполнения скриптов в MyChat Server по времени немного другая.

Скрипты сейчас выполняются не по системному времени, а по аптайму сервера. То есть, рассчитывать, что они будут работать ежеминутно секунда в секунду, с системным временем, не стоит. К тому же, если загрузка сервера высокая, или скрипт работает медленно, то идеальные тайминги вы не получите.
Аватара пользователя
ChimMAG
Речь не о секундах, а о том, что в начале суток почему-то идёт пропуск двух минут. Причём довольно стабильно - у меня была статистика за 5 дней и каждый раз ровно одно и тоже:
Код: Выделить всё
23:59
0:02

Почему не обрабатывается 0:00 и 0:01 - вот про это вопрос. Довольно стабильно не обрабатывается.
Аватара пользователя
Алексей Пикуров
Вообще-то я не должен видеть строки от 9.6.2022. Но их вижу.

Потому что вы пишете в файл эти данные. Последняя строчка перед "end.".
Касаемо конца и начала суток — на сервере выполняются регламентные работы, в автоматическом режиме, как раз на это время, вероятно, они выпадают и на конкретно вашем компьютере это занимает несколько секунд.

Я уже пояснил, как работают такие скрипты в MyChat, там нет жёсткой привязки к текущему времени. Это неправильно, но пока так.

Переношу тему в раздел скриптов.
Аватара пользователя
ChimMAG
Я думал над этим и - нет! Я не могу регулировать время запуска скриптов в чате, но могу рулить сервером. На сервере обрабатывается скрипт, который использует эти файлы, но я специально развёл их по времени. Но самое главное -
Код: Выделить всё
if (wHour=0) and (wMinute=0) then
 begin
    sDel:=DeleteFile('C:\Programs\LastTimeRun.txt');
    AddLineToFile(inttostr(wDay)+'.'+inttostr(wMonth)+'.'+inttostr(wYear)+' '+inttostr(wHour)+':'+inttostr(wMinute)+':'+inttostr(wSecond)+' - результат удаления файла: '+IntToStr(sDel),'C:\Programs\ResultDel.txt',0);
 end;


Вот это условие вообще не выполняется - файл ResultDel.txt просто не создаётся. А он точно не обрабатывается ничем и вообще вначале не существовал и должен скриптом создаваться. Но если смещаю wMinute=2, то он создаётся или в него всё добавляется. То есть речь о том, что этот условный переход не выполняется в определённое время суток.
Аватара пользователя
Алексей Пикуров
Покажите протоколы запуска скриптов. Админка, "Инструменты", "Просмотр протоколов", "Системные протоколы", тип сообщений — "Логи скриптов". И найдите временной диапазон, где происходит переход между сутками.

Опишите предполагаемую логику вашего скрипта, пожалуйста. Что именно он должен делать?

Я написал скрипт в одну строку, запустил его на нашем сервере и посмотрю, что произойдёт на границе суток. Текст скрипта:
Код: Выделить всё
begin
  AddLineToFile(FormatDateTime('dd.mm.yyyy hh:nn:ss:zzz', Now), 'c:\temp\log_every_minute.txt', 0);
end.

Результат работы в файле выглядит так:
Код: Выделить всё
14.06.2022 12:38:00:645
14.06.2022 12:39:00:699
14.06.2022 12:40:00:742
Аватара пользователя
Алексей Пикуров
Собственно, уже есть результаты, вот, пожалуйста:
14.06.2022 12:38:00:645
14.06.2022 12:39:00:699
14.06.2022 12:40:00:742 - дальше идёт запись в 12:42, а не 12:41. Между ними +/- 1 секунда, но время считается, как я уже говорил, не по системному времени, а по аптайму сервера с момента его запуска.
14.06.2022 12:42:00:991
14.06.2022 12:43:00:066
14.06.2022 12:44:00:118
14.06.2022 12:45:00:174
14.06.2022 12:46:00:214
14.06.2022 12:48:00:302

Надеюсь, я доступно пояснил вам, как работают события по времени в MyChat и почему вы можете "не поймать" точно 00:00.
Аватара пользователя
ChimMAG
Вот раздел дат и виден трёхминутный прогал в запуске скриптов.
Вложения
MyChat_14.png
MyChat_14.png (166.86 КБ) Просмотров: 270
Аватара пользователя
Алексей Пикуров
У меня лог такой:
script-timing.png
Тайминги скрипта для запуска раз в минуту
script-timing.png (8.76 КБ) Просмотров: 256
Аватара пользователя
Алексей Пикуров
Вероятно, когда идёт смена суток (00:00), скрипты не исполняются. Скорее всего, так. В любом случае, мы пока этим заниматься не будем, это несущественно.
Аватара пользователя
ChimMAG
Понятно. То есть проблема всё-таки есть. :-)