Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программное обеспечение Windows (http://forum.oszone.net/forumdisplay.php?f=7)
-   -   Время работы компьютера (http://forum.oszone.net/showthread.php?t=200780)

Delirium 01-03-2011 06:39 1624180

Время работы компьютера
 
Вложений: 2
Сегодня решил отдохнуть и узнать,сколько времени моя машина включена. Различные методы типа systeminfo и прочее - это скучно :)
Через 15 минут родилось 2 программки -консольная и оконная, единственное из назначение - вывод времени работы компьютера :) Берем из архива файл (1.exe - консольное, 2.exe - оконное), кидаем их в папку \Windows и затем достаточно будет нажать Ctrl+R (Пуск-выполнить) - и вбить туда 1 или 2 :) Файлы можно переименовать, как душе угодно, тогда надо будет вводить созданное вами имя в окне выполнения.
В Windows 7 достаточно просто нажать клавишу Пуск или Win(на клавиатуре) и ввести имя программы.

P.S. Для работы нужен Framework 2.0, т.к. студия не дает компилировать под Net 1.0, а файла csc.exe framework 1.0 у меня в семерке нет.
Если кто захочет, могу дать исходники, перекомпилим и выложим, тогда будет работать у всех без установки фреймворка :)

nixuz 25-05-2011 19:53 1682507

А реально сделать в реальном времени отсчет?

Delirium 26-05-2011 01:29 1682710

Сделать то все реально :) А цель какова? Можно сделать чтобы в трее висело приложение и при наведении показывало время работы.

Delirium 26-05-2011 02:11 1682718

Маленько обновил программку Win-версии. Теперь ее можно свернуть в трей и при наведении мыши будет показывать время работы. В шапке лежит обновленная версия(uptime_win 1.1.zip)

nixuz 26-05-2011 07:22 1682748

в версии 1.1 у меня время аптайма определилось, а потом начинает уменьшаться))

ferget 26-05-2011 08:07 1682760

а можно сделать, так чтобы отсчет шел постоянно

nixuz 26-05-2011 20:08 1683244

баг версии 1.1 с уменьшением времени означает, что впрога один раз получила данные о системном аптайме, а далее сама прибавляет (пока, правда, отнимает) единицу каждую секунду.

мне кажется, было бы правильнее, что бы программа просто раз в секунду получала данные о времени аптайма из системы

Delirium 27-05-2011 01:11 1683396

Цитата:

Цитата nixuz
а далее сама прибавляет (пока, правда, отнимает) единицу каждую секунду. »

Это кто вам такое сказал? При каждом наведении мышкой или открытии окна идет получение данных заново, а не прибавление секунд вручную. И я не могу понять, где что не работает, сейчас проверил, и при наведении и при открытии окна постоянно показывает увеличивающееся время. Приведите скрины или опишите подробно проблему.

Цитата:

Цитата ferget
а можно сделать, так чтобы отсчет шел постоянно »

ПОсмотрю сегодня, если будет время, сделаю.

Busla 27-05-2011 10:20 1683523

есть же KB232243

ferget 27-05-2011 10:28 1683534

KB232243 так может?
свернуть в трей и при наведении мыши будет показывать время работы

Busla 27-05-2011 13:28 1683657

ferget, не может, но на мой взгляд, это довольно экзотичная функция:
если требуется реально контролировать uptime - виджет на экран или на рабочий стол обоями выкладывать (BGinfo)

nixuz 28-05-2011 11:23 1684057

Вложений: 1
Цитата:

Цитата Delirium
Это кто вам такое сказал? При каждом наведении мышкой или открытии окна идет получение данных заново, а не прибавление секунд вручную. И я не могу понять, где что не работает, сейчас проверил, и при наведении и при открытии окна постоянно показывает увеличивающееся время. Приведите скрины или опишите подробно проблему.

У меня время уменьшается. Win XP SP2 MCE 2005 предустановленная на ноут + руссификация + SP3

Не важно, наводишь мышкой или переоткрываешь окно - время уменьшается.

nixuz 28-05-2011 11:30 1684064

Вложений: 1
Выявилась еще одна проблема. Сегодня я заметил, чир во всех версиях вашей программы время оказалось на много меньше, а сначала совпадало с системным аптаймом. При этом systeminfo и NHC - показывают корректно. Первый раз я скачал архив с программой 25 мая в 19:50 и запустил программу, соответственно, позже, и хотя на текущий момент прошло менее 3х суток, разница в показаниях составляет 5 дней, т.е. время уменьшается где-то в два раза быстрее, а значит есть какой-то отдельный счетчик у вашей программы, а не опрос системного времени.

ferget 29-05-2011 23:13 1684804

повтор
а можно сделать, так чтобы отсчет шел постоянно

Grabber2006 30-05-2011 00:11 1684827

Какой-то велосипед изобретаете:

1. Ctrl + Alt + Del -> Диспетчер задач -> Быстродействие -> Время работы

2. Утилита от MS uptime.exe

3. В командной строке "net statistics server" (в первой строчке - время включения)

4. В командной строке "systeminfo"

5. На Delphi:

Код:

function UpTime: string;
 const
  ticksperday: Integer    = 1000 * 60 * 60 * 24;
  ticksperhour: Integer  = 1000 * 60 * 60;
  ticksperminute: Integer = 1000 * 60;
  tickspersecond: Integer = 1000;
 var
  t:          Longword;
  d, h, m, s: Integer;
 begin
  t := GetTickCount;

  d := t div ticksperday;
  Dec(t, d * ticksperday);

  h := t div ticksperhour;
  Dec(t, h * ticksperhour);

  m := t div ticksperminute;
  Dec(t, m * ticksperminute);

  s := t div tickspersecond;

  Result := 'Uptime: ' + IntToStr(d) + ' Days ' + IntToStr(h) + ' Hours ' + IntToStr(m) +
    ' Minutes ' + IntToStr(s) + ' Seconds';
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 begin
  label1.Caption := UpTime;
 end;

GetTickCount - штатная функция WinAPI - время в миллисекундах прошедшее от старта системы (через 50 дней обнуляется).
Чтобы избежать лимита юзайте GetTickCount64 (соответственно ULONGLONG, а не LongWord).

nixuz 31-05-2011 01:30 1685408

Цитата:

Цитата ferget
а можно сделать, так чтобы отсчет шел постоянно »

В Notebook Hardware Control это релизовано.

nixuz 31-05-2011 10:02 1685519

Цитата:

Цитата Grabber2006
Ctrl + Alt + Del -> Диспетчер задач -> Быстродействие -> Время работы »

Скриншот в студию

ferget 31-05-2011 10:33 1685535


Drongo 31-05-2011 14:05 1685662

ferget, ресурс диспетчера по видимому патченый, по умолчанию в ХР такого нет. Признавайтесь какой украшалкой пользуетесь? :)

Grabber2006 31-05-2011 16:57 1685768

Без украшалок в Win7 так.

Кстати, GetTickCount64 только под Vista, 7, 2008 есть. В XP чтобы нормальное время узнать (если больше 49 дней), то надо через HKEY_PERFORMANCE_DATA\System\System Up Time или NtQuerySystemInformation

Интересно:

NtQuerySystemInformation

заполняет такую структуру:

SYSTEM_TIME_OF_DAY_INFORMATION = packed record
BootTime: LARGE_INTEGER;
CurrentTime: LARGE_INTEGER;
TimeZoneBias: LARGE_INTEGER;
CurrentTimeZoneId: ULONG;
Reserved: ULONG;
end;

которое BootTime - это время загрузки в 100-нс начиная с 1601 года.

SystemTimeOfDayInformation = 3


Delphi:

Код:

NtQuerySystemInformation(3, @s,sizeof(SYSTEM_TIME_OF_DAY_INFORMATION),nil);
n:=s.CurrentTime.QuadPart-s.BootTime.QuadPart;
n:=round(n/10000000);//сколько секунд работает система
Label1.Caption := inttostr(n);

Исходники для Lazarus и прога (до 49 дней)

Delirium 01-06-2011 01:15 1686057

Чтобы не было криков, что я отсчитываю время от единожды полученного, вот вам весь исходник 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 1686176

Delirium, а где обработка отрицательных значений?

nixuz 01-06-2011 13:29 1686335

Почему у меня в обратную сторону время идет с момента первого запуска вашего приложения? Повторюсь что systeminfo и NHC показывают норм.

Delirium 02-06-2011 01:03 1686797

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

nixuz 02-06-2011 04:03 1686825

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

Busla 02-06-2011 09:03 1686890

Delirium, ты меня иногда искренне поражаешь
MSDN по русски пишет:
Цитата:

Значение этого свойства извлекается из таймера системы и хранится как целое 32-разрядное число со знаком. Следовательно, если система работает непрерывно, значение свойства TickCount на протяжении приблизительно 24,9 дней будет возрастать, начиная с нуля и заканчивая значением Int32.MaxValue, после чего оно будет сброшено до значения Int32.MinValue, являющегося отрицательным числом, и снова начнет расти до нуля в течение следующих 24,9 дней.

Grabber2006 02-06-2011 13:02 1687029

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

Delirium 02-06-2011 13:13 1687040

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

Grabber2006 02-06-2011 20:51 1687311

Попробуйте заменить Int32 на UInt32

прога на Delphi

Demonsalar 26-01-2012 23:07 1845227

Большое спасибо за программу!

dmitru 14-10-2013 02:47 2233996

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

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


Время: 06:28.

Время: 06:28.
© OSzone.net 2001-