Russian Qt Forum
Май 18, 2024, 23:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: uptime  (Прочитано 4761 раз)
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?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 04, 2011, 15:02 »

Первое, что нагуглил http://www.xakep.ru/post/42885/default.asp.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #2 : Май 04, 2011, 16:12 »

Очень корявенько парсить Грустный
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 04, 2011, 16:13 »

Ну, это если ничего получше не найдешь. Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #4 : Май 04, 2011, 16:32 »

Похоже или парсить вывод systeminfo | find /i "up time"
или рыть в сторону NdisGetSystemUpTime, надо подробнее почитать.
Или считать время аптайма от момента запуска своего самопального сервиса.

systeminfo у меня валится с воплем на отсутствие framedyn.dll (винде более 5 лет).
« Последнее редактирование: Май 04, 2011, 16:35 от QuAzI » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.042 секунд. Запросов: 19.