Jak pobrać uptime pod Windowsem

Odpowiedz Nowy wątek
2006-07-30 22:58
0

Witam.
Na wstępie powiem, że z Windowsami mam mało do czynienia i niestety błądzę w tym temacie. Szukam jakiegoś kodu, który pozwoli mi pobrać czas pracy systemu Windows. Doszedłem do takiego czegoś:

#include <windows.h>
#include <stdio.h>
int main()
{
int time = 0;
time = GetTickCount();
printf("%i", time);
return(time);
}

Jednak z tego co czytałem to licznik przekręca się po 49 dniach. Byłbym wdzięczny za jakieś inne linki, źródła programów. Interesuje mnie C/C++.


"Nobody will ever need more than 640k RAM!" -- Bill Gates, 1981
"Windows 95 needs at least 8 MB RAM." -- Bill Gates, 1996
"Nobody will ever need Windows" -- logical conclusion

Pozostało 580 znaków

2006-07-31 09:12
0

sprawdz tu: http://koders.com/?s=uptime+windows&amp;%3Abtn=Search&%3Ala=C&_%3Ali=%2A

Pozostało 580 znaków

2006-07-31 09:17
0

Tam też sprawdzałem i większość ma: Limited to only 49 days. Pod Linuksem to jest prosto...
Znalazłe jeszcze takie coś: http://www.grzegorz.net/programowanie/uptime.zip
Kod wykląda całkiem, całkiem... pytanie czy działa. Pod Linuksem to ciężko sprawdzić.
Szukam dalej. Może ktoś ma jeszcze jakieś przykłady?


"Nobody will ever need more than 640k RAM!" -- Bill Gates, 1981
"Windows 95 needs at least 8 MB RAM." -- Bill Gates, 1996
"Nobody will ever need Windows" -- logical conclusion

Pozostało 580 znaków

2006-07-31 15:00
0

Dorwalem cos takiego:

#include <stdio.h>
#include <windows.h>
#include <string.h>
 
char* GetUptime()
{
 
   int tickCount,nTime[5];
   char szUptime[1000];
   tickCount  = GetTickCount();
   nTime[0]  = tickCount / 1000 % 60;          // Seconds
   nTime[1]  = tickCount / 1000 / 60 % 60;        // Minutes
   nTime[2]  = tickCount / 1000 / 60 / 60 % 24;      // Hours
   nTime[3]  = tickCount / 1000 / 60 / 60 / 24 % 7;    // Days
   nTime[4]  = tickCount / 1000 / 60 / 60 / 24 / 7 % 52;  // Weeks
   memset(szUptime, 0, sizeof(szUptime));
   for(int i = 4; i >= 0; i--)
   {
         char*  szLabel;
         char  tmpUptime[4];
if    (i == 4) (nTime[4] > 1 || nTime[4] == 0) ?  szLabel = " Weeks, "  : szLabel = " Week, ";
else if  (i == 3) (nTime[3] > 1 || nTime[3] == 0) ?  szLabel = " Days, "    : szLabel = " Day, ";
else if  (i == 2) (nTime[2] > 1 || nTime[2] == 0) ?  szLabel = " Hours, "  : szLabel = " Hour, ";
else if  (i == 1) (nTime[1] > 1 || nTime[1] == 0) ?  szLabel = " Minutes, "  : szLabel = " Minute, ";
else if  (i == 0) (nTime[0] > 1 || nTime[0] == 0) ?  szLabel = " Seconds"  : szLabel = " Second";
memset(tmpUptime, 0, sizeof(tmpUptime));
itoa(nTime[i], tmpUptime, 10);
strcat(strcat(szUptime, tmpUptime), szLabel);
   }
   return szUptime;
}
 
void main()
{
 
    while(getchar() !=' ')
    {
        printf("%s\n",GetUptime());
    }
 
}

Pozostało 580 znaków

2006-07-31 16:49
0

Hmmm..... Ale ten program korzysta z: GetTickCount() a podobno ta funkcja przekręca się po 49 dniach. Niestety nie mam możliwości tego sprawdzić. Nikt z moich znajomych nie ma Windowsa z takim uptime. Gdyby się dało jakoś zasymulować i sprawdzić to.....


"Nobody will ever need more than 640k RAM!" -- Bill Gates, 1981
"Windows 95 needs at least 8 MB RAM." -- Bill Gates, 1996
"Nobody will ever need Windows" -- logical conclusion

Pozostało 580 znaków

2006-07-31 22:26
0

Można pobrać date ostatniej modyfikacji jakiegoś pliku systemowego aktualizowanego tylko podczas uruchamiania. Obliczoną różnice porównać z GetTickCount i wybrać to co większe.

Pozostało 580 znaków

2006-08-01 07:32
0

Remarks
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.

If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.

To obtain the time elapsed since the computer was started, retrieve the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8-byte value. For more information, see Performance Monitoring.

Pozostało 580 znaków

2006-08-01 14:09
wooeeck
0
Valarius napisał(a)

retrieve the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8-byte value. For more information, see Performance Monitoring.

Pokaż jak wyciągnąć te 8 bajtów z rejestru pod kluczem HKEY_PERFORMANCE_DATA.
Jest tam dużo liczników: odczyty dysku, pamięci, itp.,
ale nie widzę tam nic podobnego do 'System Up Time counter'.

Pozostało 580 znaków

2006-08-03 14:30
0

Coś czytałem o tych rejestrach, ale niestety nie mam dostępu w ogóle do Windowsa. Jeżeli są tam przechowywane różne tego typu dane to będę szczęśliwy jak ktoś zna sposób by je wyciągnąć :)


"Nobody will ever need more than 640k RAM!" -- Bill Gates, 1981
"Windows 95 needs at least 8 MB RAM." -- Bill Gates, 1996
"Nobody will ever need Windows" -- logical conclusion

Pozostało 580 znaków

2006-08-06 12:14
0

Nie mogę znaleźć HKEY_PERFORMANCE_DATA w Windowsie XP 8-O

@EDIT

You won't find this key by looking in the Registry Editor; this key is available only programmatically through the Windows registry functions, such as RegQueryValueEx. Performance information isn't actually stored in the registry; the registry functions use this key to locate the information from performance data providers.

Masakra z tymi Windowsami ;]

// skoro juz przeszedles męke i znasz odpowiedz, to fajnie byloby, gdybys wrzucil gotową funkcję do faq. [mf]


"Nobody will ever need more than 640k RAM!" -- Bill Gates, 1981
"Windows 95 needs at least 8 MB RAM." -- Bill Gates, 1996
"Nobody will ever need Windows" -- logical conclusion

Pozostało 580 znaków

2006-08-06 22:02
0
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <pdh.h>
 
char* GetUptime(int iTickCount);
 
#define SAMPLE_INTERVAL_MS  1000
#define MAXPATH 80
 
int __cdecl _tmain (int argc, TCHAR **argv)
{
 
   HQUERY          hQuery;
   HCOUNTER        *pCounterHandle;
   PDH_STATUS      pdhStatus;
   PDH_FMT_COUNTERVALUE   fmtValue;
   DWORD           ctrType;
   SYSTEMTIME      stSampleTime;
   PDH_BROWSE_DLG_CONFIG  BrowseDlgData;
   CHAR            szPathBuffer[MAXPATH];
   int             nRetCode = 0;
 
   // Open the query object.
   pdhStatus = PdhOpenQuery (0, 0, &hQuery);
 
   // Allocate the counter handle array. Allocate room for
   //  one handle per command line arg, not including the
   //  executable file name.
   pCounterHandle = (HCOUNTER *)GlobalAlloc(GPTR, sizeof(HCOUNTER));
 
   strcpy(szPathBuffer,"\\System\\System Up Time");
 
   pdhStatus = PdhAddCounter (hQuery,
       szPathBuffer, 
       0, 
       pCounterHandle);
 
   // "Prime" counters that need two values to display a 
   //   formatted value.
   pdhStatus = PdhCollectQueryData (hQuery);
 
   // Print counter values until a key is pressed.
   while (!_kbhit()) {
 
       // Wait one interval.
       Sleep(SAMPLE_INTERVAL_MS);
 
       // Get the sample time.
       GetLocalTime (&stSampleTime);
 
       // Get the current data values.
       pdhStatus = PdhCollectQueryData (hQuery);
 
       // Print the time stamp for the sample.
       _tprintf (TEXT("\n %2.2d/%2.2d/%4.4d %2.2d:%2.2d:%2.2d.%3.3d "),
           stSampleTime.wMonth, 
           stSampleTime.wDay, 
           stSampleTime.wYear,
           stSampleTime.wHour, 
           stSampleTime.wMinute, 
           stSampleTime.wSecond,
           stSampleTime.wMilliseconds);
 
       // Get the current value of this counter.
       pdhStatus = PdhGetFormattedCounterValue (*pCounterHandle,
           PDH_FMT_DOUBLE,
           &ctrType,
           &fmtValue);
 
       if (pdhStatus == ERROR_SUCCESS) {
           //_tprintf (TEXT(",\"%.20g\""), fmtValue.doubleValue);
            _tprintf(TEXT(", %s"),GetUptime((int)fmtValue.doubleValue));
       } else {
 
           // Print the error value.
           _tprintf (TEXT(".\"-1\"")); 
       }
   }
 
   // Close the query.
   pdhStatus = PdhCloseQuery (hQuery);
 
   return nRetCode;
}
 
char* GetUptime(int tickCount)
{
    int nTime[5];
    char szUptime[1000];
 
    nTime[0]  = tickCount % 60;          // Seconds
    nTime[1]  = tickCount / 60 % 60;        // Minutes
    nTime[2]  = tickCount  / 60 / 60 % 24;      // Hours
    nTime[3]  = tickCount  / 60 / 60 / 24 % 7;    // Days
    nTime[4]  = tickCount  / 60 / 60 / 24 / 7 % 52;  // Weeks
    memset(szUptime, 0, sizeof(szUptime));
    for(int i = 4; i >= 0; i--)
    {
        char*  szLabel;
        char  tmpUptime[4];
        if    (i == 4) (nTime[4] > 1 || nTime[4] == 0) ?  szLabel = " Weeks, "  : szLabel = " Week, ";
        else if  (i == 3) (nTime[3] > 1 || nTime[3] == 0) ?  szLabel = " Days, "    : szLabel = " Day, ";
        else if  (i == 2) (nTime[2] > 1 || nTime[2] == 0) ?  szLabel = " Hours, "  : szLabel = " Hour, ";
        else if  (i == 1) (nTime[1] > 1 || nTime[1] == 0) ?  szLabel = " Minutes, "  : szLabel = " Minute, ";
        else if  (i == 0) (nTime[0] > 1 || nTime[0] == 0) ?  szLabel = " Seconds"  : szLabel = " Second";
        memset(tmpUptime, 0, sizeof(tmpUptime));
        itoa(nTime[i], tmpUptime, 10);
        strcat(strcat(szUptime, tmpUptime), szLabel);
    }
    return szUptime;
}

Sprawdz to ;)
nie dam glowy ze sie nie przekreci licznik po tych 49.7 dniach :)
ale kod jest z msdn.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0