Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: QuAzI от Май 04, 2011, 14:58



Название: uptime
Отправлено: QuAzI от Май 04, 2011, 14:58
Задачка довольно тривиальная - получить время, сколько работает ПК.
Поискал. Нашёл http://stackoverflow.com/questions/1645896/system-uptime-in-delphi-2009
GetTickCount - лимит в 49 дней, доступно с win2000 и по win2003 для 32-битных. Для 64-битных и вообще начиная с Visla соответственно GetTickCount64 надо использовать. Узковатый круг применения.
QueryPerformanceCounter, на сколько понял по поиску, на многопроцессорных или меняющих тактовую частоту процессорах будет выдавать чушь.
Нашёл тему http://www.codeguru.com/forum/archive/index.php/t-304599.html (пост AdaraCD), попытался адаптировать
Код:
#if (defined __WIN32__)
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <tchar.h>
#include <wchar.h>

typedef LONG (WINAPI *pNtQuerySystemInformation)(UINT,PVOID,ULONG,PULONG);

typedef struct _SYSTEM_TIME_OF_DAY_INFORMATION
{
LARGE_INTEGER BootTime;
LARGE_INTEGER CurrentTime;
LARGE_INTEGER TimeZoneBias;
ULONG CurrentTimeZoneId;
} SYSTEM_TIME_OF_DAY_INFORMATION, *PSYSTEM_TIME_OF_DAY_INFORMATION;
#endif

...

    #if (defined __WIN32__)
        SYSTEMTIME stBootTime;
        pNtQuerySystemInformation pfNtQuerySystemInformation;
        SYSTEM_TIME_OF_DAY_INFORMATION SysTimeInfo;
        FILETIME ftBootTime;

        pfNtQuerySystemInformation = (pNtQuerySystemInformation)
        GetProcAddress(GetModuleHandle(_T( (const WCHAR*)"ntdll")),"NtQuerySystemInformation");

        pfNtQuerySystemInformation(3,&SysTimeInfo,sizeof(SysTimeInfo),0) ;

        ftBootTime = *(FILETIME *)&(SysTimeInfo.BootTime);
        FileTimeToLocalFileTime(&ftBootTime,&ftBootTime);
        FileTimeToSystemTime(&ftBootTime,&stBootTime);
        qDebug() << stBootTime.wDay << stBootTime.wHour << stBootTime.wMinute << stBootTime.wSecond;
    #endif
Этот вариант просто прибивается виндой.
Потыкался в исходники агента Zabbix - там вообще собственная обвязка под всё, поседеешь, пока разберёшься.
Есть какой-нибудь простой и красивый вариант получить аптайм на винде в Qt?


Название: Re: uptime
Отправлено: Пантер от Май 04, 2011, 15:02
Первое, что нагуглил http://www.xakep.ru/post/42885/default.asp.


Название: Re: uptime
Отправлено: QuAzI от Май 04, 2011, 16:12
Очень корявенько парсить :(


Название: Re: uptime
Отправлено: Пантер от Май 04, 2011, 16:13
Ну, это если ничего получше не найдешь. ;)


Название: Re: uptime
Отправлено: QuAzI от Май 04, 2011, 16:32
Похоже или парсить вывод systeminfo | find /i "up time"
или рыть в сторону NdisGetSystemUpTime, надо подробнее почитать.
Или считать время аптайма от момента запуска своего самопального сервиса.

systeminfo у меня валится с воплем на отсутствие framedyn.dll (винде более 5 лет).