Získávame čas běhu počítače v C#

C# .NET Pro pokročilé Získávame čas běhu počítače v C#

Pokud vás někdy zajímalo jak dlouho vám počítač běží, pak si ukážeme způsob jak tento čas jednoduše zjistit.

Metod na zjištění času spuštění je více. Když jsem vyvíjel WakeWorker, kde tuto možnost používám, setkal jsem se s problémem, že na některém systému fce nefungovali korektně či vůbec.

Tohle je první příklad. Využívá získání informací o systému pomocí WMI. Existuje nástroj WMI Code Creator, kde si naklikáte co chcete zjistit a on vám přímo podobný kód jako je níže vygeneruje. Pozn. pokud se vám nechce hledat přibalil jsem jej ke stažení :) Je třeba přidat referenci System.Manage­ment.

private static DateTime GetUptime()
{
        ManagementObject mo = new ManagementObject(@"\\.\root\cimv2:Win32_OperatingSystem=@");
        return ManagementDateTimeConverter.ToDateTime(mo["LastBootUpTime"].ToString());
}

Tato fce nám vrátí DateTime, kde je uložen čas, kdy jsme spustili počítač. Pokud například na XP nebo starších systémech tato fce nefunguje, lze použít tuto:

private static TimeSpan GetUptimeXP()
{
        PerformanceCounter uptime = new PerformanceCounter("System", "System Up Time");
        uptime.NextValue();
        return TimeSpan.FromSeconds(uptime.NextValue());
}

Tato fce nám však vrátí jak dlouho počítač běží a je v TimeSpanu. Převedeme jej tedy na stejný formát jako u předchozí fce pomocí jednoduchého odečtení DateTime.Now - GetUptimeXP()

Ukážeme si práci s klíčovým slůvkem out a ošetříme kompatibilitu.

public static bool GetPcUptime(out DateTime lastUp)
{
        try
        {
                lastUp = GetUptime();
        }
        catch
        {
                try
                {
                        lastUp = DateTime.Now - GetUptimeXP();
                }
                catch
                {
                        lastUp = DateTime.Now;
                        return false;
                }
        }
        return true;
}

Tyto metody si vložíme do nějaké třídy například UpTime. Nyní si ukážeme jak je použít na nějakém Formu.

Timer myTimer = new Timer();
DateTime lastUp;

public Form1()
{
        InitializeComponent();

        if (!UpTime.GetPcUptime(out lastUp))
                MessageBox.Show("Tato fce není vaším systémem podporována", "UP Time", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);

        myTimer.Interval = 1000;
        myTimer.Tick += new System.EventHandler(myTimer_Tick);
        myTimer.Enabled = true;
}

private void myTimer_Tick (object sender, EventArgs e)
{
        // Rozdíl mezi časem, kdy byl počítač spuštěn a současným časem - získám jak dlouho běží
        TimeSpan upTime = DateTime.Now - lastUp;
        // Výpis času spuštění počítače a čas jeho běhu
        myLabel.Text = lastUp.ToString("dd.MM.yyyy   H:mm:ss") + "\n" + upTime.TotalSeconds;
}

Pozn. Povšimněte si, že jsem metodu Show u MessageBoxu dosti protáhnul. Hlavně jsem chtěl Ikonku chyby a aby se zobrazila jako samostatný form a v popředí. Čehož jsem dosáhl pomocí MessageBoxIcon.Error a MessageBoxOptions.DefaultDesktopOnly.

Abychom nemuseli na výstup psát upTime.Days, Hours etc. vytvoříme si další fci, která za nás TimeSpan zformátuje. A naučíme se pracovat ze StringBuilderem.

Jednoduše si vytvoříme instanci StringBuilderu dáme mu nějakou rozumnou délku a jednoduchými podmínkami přidáváma postupně čas a indikátory dnů, hodin, minut.

public static string ShowTime(TimeSpan time)
{
        StringBuilder sb = new StringBuilder(50);
        if (time.Days > 0) sb.Append(time.Days).Append("d ");
        if ((time.Hours > 0) || (time.Days > 0)) sb.Append(time.Hours).Append("h ");
        if ((time.Minutes > 0) || (time.Hours > 0) || (time.Days > 0)) sb.Append(time.Minutes).Append("m ");
        sb.Append(time.Seconds).Append("s");
        return sb.ToString();
}

Nyní stačí jen do formu přidat nějaký Label a nechat program na něm zobrazovat uptime :)

Ukázka spuštěného programu

 

Stáhnout

Staženo 395x (162.03 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (1 hlasů) :
22 222


 


Miniatura
Předchozí článek
C# na Linux - Mono snadno a rychle
Miniatura
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
SkypeBot v C#

 

 

Komentáře

Avatar
matesax
Redaktor
Avatar
matesax:

Nestačí jen

Environment.TickCount

?

:)
 
Odpovědět 29.8.2012 15:26
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

No tam je průser, když máš počítač puštěnej víc jak 49 dní, protože to překročí hodnotu 32kovýho integeru. A vidíš z obrázku, že takový lidi existují :D Navíc funguje to trošku jinak. vrací to čas od spuštění počítače například i z režimu hibernace. Kdežto ty metody co jsem uvedl vrací čas spuštění pčoítače po vypnutí nebo restartu a není v nich započtena doba spánku nebo hibernace.

Ale ta možnost tu je, pokud chceš vědět, před kolika dny jsi ho probudil z hibernace a není to více jak 49 dní. Uvedu tu jak se to dá použít v té ukázce, aby si to mohli čtenáři vyzkoušet :)

Je to čas v milisekundách, jednoduše použijeme metodu ze třídy TimeSpan a překonvertujeme si integer do TimeSpanu a pak jej pomocí metody ShowTime převedeme na zkonvertovaný string.

AdditionalFunctions.ShowTime(TimeSpan.FromMilliseconds(Environment.TickCount))
Odpovědět 29.8.2012 15:49
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

Nebo:

MessageBox.Show(TimeSpan.FromMilliseconds(Environment.TickCount).ToString());
 
Odpovědět 29.8.2012 15:57
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

Psal jsem "Uvedu tu jak se to dá použít v té ukázce, aby si to mohli čtenáři vyzkoušet". Tzn že ukazuji jak to použít v tom programu co si teď vytvořili. :)

Odpovědět 29.8.2012 15:59
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

A taky nevím, zda to nebude nepřesné. Jak slyším to Tick. Hodně jsem vídal, že někdo dělá stopky stylem že vezme Timer a nastaví si vteřinové intervali a podle toho inkrementuje čas. Ale to je nepřesné. Za několik hodin se to zpozdí tak o 7 minut. Správně se má uložit čas spuštění a pak dělat rozdíl se současným časem.

Odpovědět 29.8.2012 16:05
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Kit:

Kdysi dávno jsem také řešil, že jsem měl PC zapnuté přes 500 dní a uptime se mi vynulovalo. Docela nepříjemné. Dnes s tím problém není, už to spravili.

Odpovědět  +1 29.8.2012 20:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
David Jančík [sczdavos]:

U starších Windows byl problém se špatným datovým typem. Když běžel více jak týden tak došlo k přetečení a k chybě. Nepříjemné to bylo zejména u serverů, které tento OS používali. Je to docela vtipné :D

Odpovědět 29.8.2012 21:42
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Kit:

Ano, v mém případě to bylo na serveru. Ten problém byl před několika lety snad definitivně vyřešen změnou datového typu čítače na int64. Ovšem od té doby jsem uptime větší než 200 dní neměl. Vždy se našel nějaký vůl s přístupem k rozvaděči. UPS to déle než 15 minut neutáhne.

Odpovědět 29.8.2012 22:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.