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