| //+------------------------------------------------------------------+
|
| //| 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);
|
| }
|