PDA

Показать полную графическую версию : Время работы компьютера


Страниц : 1 [2]

Delirium
01-06-2011, 01:15
Чтобы не было криков, что я отсчитываю время от единожды полученного, вот вам весь исходник DOS приложения. WIN приложение делает тоже самое, только выводит данные на форму:

namespace uptime
{
class Program
{
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
static void Main(string[] args)
{
string s1, s2;
int systemUptime = Environment.TickCount;
// The tick at which the last input was recorded
int LastInputTicks = 0;
// The number of ticks that passed since last input
int IdleTicks = 0;

// Set the struct
LASTINPUTINFO LastInputInfo = new LASTINPUTINFO();
LastInputInfo.cbSize = (uint)Marshal.SizeOf(LastInputInfo);
LastInputInfo.dwTime = 0;

// If we have a value from the function
if (GetLastInputInfo(ref LastInputInfo))
{
// Get the number of ticks at the point when the last activity was seen
LastInputTicks = (int)LastInputInfo.dwTime;
// Number of idle ticks = system uptime ticks - number of ticks at last input
IdleTicks = systemUptime - LastInputTicks;
}

// Set the labels; divide by 1000 to transform the milliseconds to seconds

s1 = Convert.ToString(systemUptime / 1000) + " секунд";
s2 = Convert.ToString(IdleTicks / 1000) + " seconds";

TimeSpan t = TimeSpan.FromSeconds(systemUptime / 1000);
t = TimeSpan.FromSeconds(systemUptime / 1000);


string itog = t.Days.ToString() + "дн:" + t.Hours.ToString() + "ч:" + t.Minutes.ToString() + "м:" + t.Seconds.ToString() + "с.";
Console.Write("\n\nВремя работы системы: " + s1 + "\n\nили " + itog);


Console.Write("\n\nFreeware special for OsZone.Net :)\nby Delirium\n\n");
var name = Console.ReadKey(true);

}
internal struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
}
}

Busla
01-06-2011, 09:23
Delirium, а где обработка отрицательных значений?

nixuz
01-06-2011, 13:29
Почему у меня в обратную сторону время идет с момента первого запуска вашего приложения? Повторюсь что systeminfo и NHC (http://www.oszone.net/go.php?url=http://pbus-167.com) показывают норм.

Delirium
02-06-2011, 01:03
хм. Вы меня прямо в тупик поставили. Сколько не проверял на кучке машин, не выловил отрицательных значений....
nixuz, а какой аптайм у твоей машины? Более 49 дней?

nixuz
02-06-2011, 04:03
нет, месяц
но у меня не отрицательные пока значения просто если на текущий момент реальный аптайм 32 дня, то в этих програмках - 17 дней и уменьшается

Busla
02-06-2011, 09:03
Delirium, ты меня иногда искренне поражаешь
MSDN по русски пишет (http://msdn.microsoft.com/ru-ru/library/system.environment.tickcount.aspx):
Значение этого свойства извлекается из таймера системы и хранится как целое 32-разрядное число со знаком. Следовательно, если система работает непрерывно, значение свойства TickCount на протяжении приблизительно 24,9 дней будет возрастать, начиная с нуля и заканчивая значением Int32.MaxValue, после чего оно будет сброшено до значения Int32.MinValue, являющегося отрицательным числом, и снова начнет расти до нуля в течение следующих 24,9 дней.

Grabber2006
02-06-2011, 13:02
В Delphi оно интерпретируется как Integer (целое, без знака), поэтому и не врёт (знак в старшем разряде записывается).

Delirium
02-06-2011, 13:13
Busla, честно? Код был частично содран с англоязычного сайта какого то, и я не читал описания TickCount, потому и не встретил этого бага. Переделаю на днях как положено.

Grabber2006
02-06-2011, 20:51
Попробуйте заменить Int32 на UInt32

прога на Delphi (http://www.2shared.com/file/BhuaT3m7/SysUpTime.html)

Demonsalar
26-01-2012, 23:07
Большое спасибо за программу!

dmitru
14-10-2013, 02:47
У меня на Windows x64bit работает нормально, запускается с рабочего стола, У меня на Windows x64bit работает нормально, запускается с рабочего стола.
Кстати начал искать способ узнать время работы после того как штатная команда cmd/systeminfo перестала отображать именно "время работы" все остальное отображает.

Спасибо автору программки - выручил сильно




© OSzone.net 2001-2012