2026-10-29 22:07:36 +03:00 | | | //+------------------------------------------------------------------+
|
| | | //| OnStart: точка входа сервиса |
|
| | | //+------------------------------------------------------------------+
|
2026-10-28 23:43:05 +03:00 | | | void OnStart()
|
| | | {
|
| | | PrintFormat("Запуск сервиса для экземпляра '%s'", InstanceFolder());
|
| | |
|
2026-10-29 22:07:36 +03:00 | | | //--- Разброс интервала, чтобы записи разных сервисов не совпадали по фазе
|
2026-10-28 23:43:05 +03:00 | | | MathSrand((int)TimeLocal() + (int)GetTickCount());
|
| | |
|
| | | const int interval_ms = InpIntervalSec * 1000;
|
| | |
|
| | | while(!IsStopped())
|
| | | {
|
2026-10-29 22:07:36 +03:00 | | | //--- 1. Подключаемся к базе, если ещё не подключены
|
2026-10-28 23:43:05 +03:00 | | | if(g_db == INVALID_HANDLE)
|
| | | {
|
| | | if(!OpenDatabase())
|
| | | {
|
| | | Sleep(interval_ms);
|
| | | continue;
|
| | | }
|
| | | g_terminal_id = -1;
|
| | | }
|
| | |
|
2026-10-29 22:07:36 +03:00 | | | //--- 2. Регистрируем терминал, если ещё не зарегистрирован
|
2026-10-28 23:43:05 +03:00 | | | if(g_terminal_id < 0)
|
| | | {
|
| | | g_terminal_id = RegisterTerminal();
|
| | | if(g_terminal_id < 0)
|
| | | {
|
| | | Sleep(interval_ms);
|
| | | continue;
|
| | | }
|
| | | }
|
| | |
|
2026-10-29 22:07:36 +03:00 | | | //--- 3. Записываем текущее состояние
|
2026-10-28 23:43:05 +03:00 | | | if(!StoreState())
|
| | | {
|
| | | g_skipped++;
|
| | | if(g_skipped % 10 == 0)
|
| | | PrintFormat("Пропущено записей: %d, последняя ошибка: %d",
|
| | | g_skipped, GetLastError());
|
| | | }
|
| | |
|
2026-10-29 22:07:36 +03:00 | | | //--- 4. Ждём до следующей итерации, добавляя небольшой случайный разброс
|
2026-10-28 23:43:05 +03:00 | | | int pause = interval_ms;
|
| | | if(InpJitterMs > 0)
|
| | | pause += (int)(MathRand() % InpJitterMs);
|
| | | Sleep(pause);
|
| | | }
|
| | |
|
| | | if(g_db != INVALID_HANDLE)
|
| | | DatabaseClose(g_db);
|
| | | }
|