Toon posts:

[Delphi] uptime routine?

Pagina: 1
Acties:
  • 110 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoe vraag ik in Delphi de uptime van de machine op?

GetTickCount (Windows unit) en timeGetTime (MMSystem unit) doen dat prima, maar geven een DWORD terug, waar je maar maximaal 49,71 dagen in kwijt kunt.

In de help by GetTickCount staat: "Windows NT: To obtain the time elapsed since the computer was started, look up the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8 byte value."

Maar als ik op mijn machine (XP Pro) HKEY_PERFORMANCE_DATA probeer aan te spreken, krijg ik geen enkele key te zien:
Delphi:
1
2
3
4
5
6
7
8
9
10
  slKeys := TStringList.Create;
  with TRegistry.Create do try
    RootKey := HKEY_PERFORMANCE_DATA;
    OpenKey('\', False);
    GetKeyNames(slKeys);
    WriteLn(slKeys.Text);
  finally
    Free;
    slKeys.Free;
  end;
Resultaat: 1 lege regel, veroorzaakt door WriteLn...
(Bij HKCU, HKLM, etc. kun je op deze manier wel prima de keys uitlezen).

Search al gebruikt, maar die gaf 3 zinloze links (lastig zoeken als een Tweaker 'Delphi' als nick heeft :)), en 1 niet te openen link.

Iemand enig idee? Mag wat mij betreft ook best VC of zo zijn, dat zet ik dan wel over naar Delphi, maar hoe heet die key precies, en hoe kan ik daar bij?

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 15:50

Hu9o

Schokkend

kan je niet gewoon de datum begin en datum NOW() van elkaar afhalen?

datum begin bepaald je aan de hand van gettickcount (moet wel binnen de eerste 49 dagen)
Deze datum zet je in een variabele (als deze nog geen waarde heeft)
Bij de volgende oproep van de functie ga je gewoon de data van elkaar afhalen.

Hier zijn ook al standaard functies voor die rekening houden met schrikkeljaren enzo.

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 15:39
je kan ook iets doen met de modified-date van de swapfile.

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


Verwijderd

Dit vond ik door met google te zoeken
The procedure makes use of a Windows API function
called GetTickCount, which returns the number of
milliseconds that have elapsed since Windows has
started. The WinAPI documentation states that after
49 days of continuous use, the tick count recycles
back to zero, so if your machine runs on a continuous
basis with Windows, you may consider this.
Verder gebruik ik zelf altijd deze code om de uptime van een machine te bepalen. Misschien heb je er wat aan.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
This is the OnClick event handler for Button1. It
will display a message box with text in this format:

  Windows started on Thursday, February 10, 2000 at 11:42:46 AM
  Its been up for 0 days, 3 hours, 22 minutes, 54 seconds
}

procedure WinUpTime();
var
  ndays: double;
  ticks: LongInt;
  btime: TDateTime;
begin
  {The GetTickCount function retrieves the number of
   milliseconds that have elapsed since Windows was started.}
  ticks := GetTickCount;

  {to convert this to the number of days, divide by number of
   milliseconds in a day, 24*60*60*1000=86400000}
  ndays := ticks/86400000;

  {to calculate the boot time we subtract the
   number-of-days-since-boot from the DateTime now.
   This works because a TDateTime is a double value
   which holds days and decimal days}
  bTime := now-ndays;

  {display the message}
   frmWinUpTime.Label1.Caption :=
   FormatDateTime('"Windows started on" dddd, mmmm d, yyyy, ' +
                  '"at" hh:nn:ss AM/PM', bTime) + #10#13 +
   'Its been up for ' + IntToStr(Trunc(nDays)) + ' days,' +
   FormatDateTime(' h "hours," n "minutes," s "seconds"',ndays);
end;

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het is een dynamische registry key. Dat werkt wat anders. En het is zo ie zo niet echt simpel.

Kijk anders eens naar
http://www.wilsonc.demon.co.uk/delphi.htm en dan 'NT Specific Components'
of
http://www.delphi-jedi.org en dan Performance Monitor API

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Hu9o, datum begin min Now() zal heel dicht in de buurt van 0 seconden komen, 't is nl. een commandline utility'tje.

Tampie, die swapfile is wel een idee, maar dan moet ik ergens op kunnen vragen waar de actieve swapfile(s) staat/staan. Zal best wel kunnen, maar moet m.i. niet nodig zijn.
Maar als 't via de registry niet lukt, is dat ws de beste optie.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 03 December 2002 @ 21:53:
Dit vond ik door met google te zoeken
Dat vond de TS ook al. En hij gaf aan dat ie dat niet voldoende vond...

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Verwijderd schreef op 03 December 2002 @ 21:54:
Hu9o, datum begin min Now() zal heel dicht in de buurt van 0 seconden komen, 't is nl. een commandline utility'tje.
Hoezo zou dit niet werken, want volgens mij is dat juist wel een goede oplossing :?

[ Voor 3% gewijzigd door Verwijderd op 03-12-2002 22:00 ]


Verwijderd

Topicstarter
Verwijderd schreef op 03 december 2002 @ 22:00:
Hoezo zou dit niet werken, want volgens mij is dat juist wel een goede oplossing :?
Het zal je verbazen hoeveel windows servers meer dan 49 dagen up zijn...

Verwijderd

Verwijderd schreef op 03 december 2002 @ 22:05:
[...]

Het zal je verbazen hoeveel windows servers meer dan 49 dagen up zijn...
Ja dat geloof ik ook wel...

Ik ben er niet helemaal bij geloof ik, maar de datum dat windows gestart is wordt waarschijnlijk dan ook gereset na 49 dagen??? Of alleen het aantal miliseconden dat je terugkrijgt van GetTickCount???

Verwijderd

Topicstarter
Verwijderd schreef op 03 December 2002 @ 22:09:
Ik ben er niet helemaal bij geloof ik, maar de datum dat windows gestart is wordt waarschijnlijk dan ook gereset na 49 dagen??? Of alleen het aantal miliseconden dat je terugkrijgt van GetTickCount???
In die HKEY_PERFORMANCE_DATA wordt 'ie bijgehouden als 8 bytes (uint64), terwijl GetTickCount alleen een DWORD teruggeeft, de onderste 4 bytes dus.

Nu nog bij die registry key komen... :)

Verwijderd

Delphi 3.0 Performance Data Viewer for NT
Perfmon displays a tree view of the data held in the dynamic HKEY_PERFORMANCE_DATA registry hive. The download includes components which encapsulate the performance data - including source, and a demo program.
bron : http://www.wilsonc.demon.co.uk/delphi3.htm

De source zit bij erbij. Als hier niet in staat wat jij zoekt weet ik het ook niet meer :D

Verwijderd

Topicstarter
Verwijderd schreef op 03 December 2002 @ 22:28:
De source zit bij erbij. Als hier niet in staat wat jij zoekt weet ik het ook niet meer :D
Thanks! Ik was je andere links al aan 't scannen, en was er al achter dat ik de boel moest benaderen via RegQueryValueEx() i.p.v. TRegistry, maar dit was wat ik zocht.
De key heet dus '\System\System Up Time', en ik zocht naar '\System Up Time', en nog een stel varianten daarop (spaties weg, vervangen door '_', enz.).

edit:
Die andere links waren van LordLarry, waarvoor nog mijn dank.

[ Voor 12% gewijzigd door Verwijderd op 03-12-2002 22:56 ]

Pagina: 1