52 lines
1.6 KiB
Text
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);
| |||
}
|