А как можно узнать Up Time системы?
ВБ 6.0
Hе скучай,_All_. С уважением,Виталий.
Вы, было дело, писали 23 мая 2003 г., 20:56:
VP> А как можно узнать Up Time системы?
VP> ВБ 6.0
Private Declare Function GetTickCount& Lib "kernel32" ()
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPD...@Allapi.net
'Get the tickcount
ret& = GetTickCount&
MsgBox Str$(ret& / 60000) + " minutes."
End Sub
--
С уважением, Alexander
11:20:42 PM
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Alexander Asyabrik и Vitaliy Pryahin сидели дома,пили пиво и болтали на тему
_Re: Аптайм системы_.
VP>> А как можно узнать Up Time системы?
VP>> ВБ 6.0
AA> Private Declare Function GetTickCount& Lib "kernel32" ()
AA> Private Sub Form_Load()
AA> 'KPD-Team 1998
AA> 'URL: http://www.allapi.net/
AA> 'E-Mail: KPD...@Allapi.net
AA> 'Get the tickcount
AA> ret& = GetTickCount&
AA> MsgBox Str$(ret& / 60000) + " minutes."
AA> End Sub
Спасибо, было бы совсем замечательно если бы можно было отобразить это в виде:
день.часы.минуты. :)
Hе скучай,_Alexander_. С уважением,Виталий.
VP> Спасибо, было бы совсем замечательно если бы можно было отобразить это в
VP> виде: день.часы.минуты. :)
MsgBox "Windows up for: " & CDate (GetTickCount / 86400000)
With best regards, A. Skrobov. E-mail: tyom...@r66.ru
--
Вы, было дело, писали 24 мая 2003 г., 19:54:
VP> AA> ret& = GetTickCount&
VP> AA> MsgBox Str$(ret& / 60000) + " minutes."
VP> Спасибо, было бы совсем замечательно если бы можно было отобразить это в виде:
VP> день.часы.минуты. :)
Тут простор для фантазии! Не повторяя A. Skrobov, можно вот так:
MsgBox DateAdd("s", ret / 1000, 0)
Но это если только время не больше суток. Если больше, то использовать
банальную арифметику. Навроде
Dim hms As Date, hms&
ret=ret\1000
dney = ret \ 86400
hms = DateAdd("s", ret Mod 86400, 0)
MsgBox dney & " д " & Hour(hms) & " ч " & Minute(hms) & " м " & Second(hms) & " с"
Дело в том, что минимальная дата, которая может быть помещена в
переменную типа Date это 1 January 100. Поэтому тут встроенные функции
работы с датами не помогают практически. И еще надо помнить, что
GetTickCount каждые 49,7 суток сбрасывает счетчик на ноль.
--
С уважением, Alexander
AA> Дело в том, что минимальная дата, которая может быть помещена в
AA> переменную типа Date это 1 January 100. Поэтому тут встроенные функции
AA> работы с датами не помогают практически. И еще надо помнить, что
AA> GetTickCount каждые 49,7 суток сбрасывает счетчик на ноль.
Эти функции прекрасно помогают: в переменной Date может храниться и время (суток) без собственно даты.
Так что мой пример вполне действенен.
With best regards, A. Skrobov. E-mail: tyom...@r66.ru
--
A. Skrobov и Vitaliy Pryahin сидели дома,пили пиво и болтали на тему _Re:
Аптайм системы_.
AS> 19:54:31 +0400:
VP>> Спасибо, было бы совсем замечательно если бы можно было отобразить это в
VP>> виде: день.часы.минуты. :)
AS> MsgBox "Windows up for: " & CDate (GetTickCount / 86400000)
чет он какую-то левую дату выдает.
31/12/1899 18:55:34
^^^^^^^^^^
Hе скучай,_A._. С уважением,Виталий.
Alexander Asyabrik и Vitaliy Pryahin сидели дома,пили пиво и болтали на тему
_Re: Аптайм системы_.
AA> Hо это если только время не больше суток. Если больше, то использовать
AA> банальную арифметику. Hавроде
AA> Dim hms As Date, hms&
AA> ret=ret\1000
AA> dney = ret \ 86400
AA> hms = DateAdd("s", ret Mod 86400, 0)
AA> MsgBox dney & " д " & Hour(hms) & " ч " & Minute(hms) & " м " &
AA> Second(hms) & " с"
все работает,спасибо всем!
AA> Дело в том, что минимальная дата, которая может быть помещена в
AA> переменную типа Date это 1 January 100. Поэтому тут встроенные функции
AA> работы с датами не помогают практически. И еще надо помнить, что
AA> GetTickCount каждые 49,7 суток сбрасывает счетчик на ноль.
т.е. допустим аптайм в 5 дней я уже не увижу?
а как же быть?
Hе скучай,_Alexander_. С уважением,Виталий.
Вы, было дело, писали 25 мая 2003 г., 3:30:
AS> Hello, Alexander!
AA>> Дело в том, что минимальная дата, которая может быть помещена в
AA>> переменную типа Date это 1 January 100. Поэтому тут встроенные функции
AA>> работы с датами не помогают практически.
AS> Эти функции прекрасно помогают: в переменной Date может храниться и время (суток) без собственно даты.
AS> Так что мой пример вполне действенен.
_Время_ и в моем примере хранится в переменной типа Date (только я в
примере ошибочно повторил декларацию и как Long, виноват это был
Dney&). Но твой пример будет показывать что-то приличное ТОЛЬКО если
время работы системы не превышает суток, а потом будет что-то подобное
вот этому:
Windows up for: 31.12.1899 23:45:56
А все потому, что Format(CDate(0), "Long Date") возвращает
30 декабря 1899 г.
То есть именно от этой даты идет отсчет.
Соответственно для помещения более ранней даты в переменную типа Date
нужно вводить отрицательные значения:
CDate(-10) возвратит дату на 10 дней более раннюю чем 30.12.1899.
А отвечал я Vitaliy Pryahin на следующее послание:
VP> Спасибо, было бы совсем замечательно если бы можно было отобразить это в виде:
VP> день.часы.минуты. :)
Вряд ли ему подойдет твой вариант. Не так ли, Vitaly?
--
С уважением, Alexander
Вы, было дело, писали 25 мая 2003 г., 12:44:
VP> AA> работы с датами не помогают практически. И еще надо помнить, что
VP> AA> GetTickCount каждые 49,7 суток сбрасывает счетчик на ноль.
VP> т.е. допустим аптайм в 5 дней я уже не увижу?
VP> а как же быть?
Дык в 5 то увидишь, а вот в 50 уже нет. Тут Билл, что называется,
плюнул в вечность. GetTickCount возвращает время в милисекундах и
помещает это в DWORD (максимум 2^32). Вот отсюда такое ограничение.
Видимо ребята из MS реально представляли, что их операционка уж никак
больше месяца не проработает без перезагрузки :).
А как быть, это уже видимо не ко мне. Может быть какими-то косвенными
способами определять. Например проверяя дату файлов бэкапов реестра,
которые делает система при загрузке или еще что-нибудь подобное.
Возможно в новых операционках (например XP) есть что-нибудь типа
GetTickCountEx (по крайней мере это было бы логично!) с расширенным
максимальным периодом, но не могу подтвердить этот факт, ибо не имею
доступа ни к MSDN, ни к компу с XP в данный момент.
Так что извиняй.
--
С уважением, Alexander
2:59:50 PM
AA>>> Дело в том, что минимальная дата, которая может быть помещена в
AA>>> переменную типа Date это 1 January 100. Поэтому тут встроенные функции
AA>>> работы с датами не помогают практически.
AS>> Эти функции прекрасно помогают: в переменной Date может храниться и
AS>> время (суток) без собственно даты.
AS>> Так что мой пример вполне действенен.
AA> _Время_ и в моем примере хранится в переменной типа Date (только я в
AA> примере ошибочно повторил декларацию и как Long, виноват это был
AA> Dney&). Но твой пример будет показывать что-то приличное ТОЛЬКО если
AA> время работы системы не превышает суток, а потом будет что-то подобное
AA> вот этому:
AA> Windows up for: 31.12.1899 23:45:56
AA> А все потому, что Format(CDate(0), "Long Date") возвращает 30 декабря 1899 г.
AA> То есть именно от этой даты идет отсчет.
AA> Соответственно для помещения более ранней даты в переменную типа Date
AA> нужно вводить отрицательные значения:
AA> CDate(-10) возвратит дату на 10 дней более раннюю чем 30.12.1899.
Ага, въехал.
AA> А отвечал я Vitaliy Pryahin на следующее послание:
VP>> Спасибо, было бы совсем замечательно если бы можно было отобразить это в
VP>> виде: день.часы.минуты. :)
Чтоб не терять лица, напишу и такой вариант по-своему:
MsgBox "Windows up for: " & CInt(GetTickCount / 86400000) & " days, " & _
CDate((GetTickCount Mod 86400000) / 86400000)
Одна строка :)
With best regards, A. Skrobov. E-mail: tyom...@r66.ru
--
Вы, было дело, писали 25 мая 2003 г., 19:51:
AS> Чтоб не терять лица, напишу и такой вариант по-своему:
AS> MsgBox "Windows up for: " & CInt(GetTickCount / 86400000) & " days, " & _
AS> CDate((GetTickCount Mod 86400000) / 86400000)
AS> Одна строка :)
Проанализируем ее: 2 вызова API функции, дробное деление
GetTickCount/86400000 с последующим преобразованием результата к
целому CInt (можно ведь просто GetTickCount \ 86400000) , странный
формат отображения результата типа 2 days, 12:59:19.
Да и не надо отождествлять число строк кода со сложностью кода. Все
равно компилятор разберет эту твою длинную строку на составляющие.
Не стал бы снова писать, если бы для закрытия этой темы (вроде пора
уже закрывать:) не следовало было бы указать на то, что где-то после
25 суток функция начнет возвращать отрицательные значения. Конечно
функция об этом знать не будет :), но бейсиковская Long она-то со
знаком и при определенном значении результата будет трактовать
полученное значение как отрицательное. C учетом сказанного код
несколько меняется:
Dim hms As Date, dney&, ret&
ret = GetTickCount()
ret = ret \ 1000
ret = IIf(ret < 0, ret + 4294967, ret)
dney = ret \ 86400
hms = DateAdd("s", ret Mod 86400, 0)
MsgBox dney & " д " & Hour(hms) & " ч " & Minute(hms) & " м " & Second(hms) & " с"
Так что тут одной строкой уж точно не отделаешься. Или..?
--
С уважением, Alexander
9:19:11 PM
Alexander Asyabrik и Vitaliy Pryahin сидели дома,пили пиво и болтали на тему
_Re: Аптайм системы_.
AA> Дык в 5 то увидишь, а вот в 50 уже нет. Тут Билл, что называется,
AA> плюнул в вечность. GetTickCount возвращает время в милисекундах и
AA> помещает это в DWORD (максимум 2^32). Вот отсюда такое ограничение.
AA> Видимо ребята из MS реально представляли, что их операционка уж никак
AA> больше месяца не проработает без перезагрузки :).
AA> А как быть, это уже видимо не ко мне. Может быть какими-то косвенными
AA> способами определять. Hапример проверяя дату файлов бэкапов реестра,
AA> которые делает система при загрузке или еще что-нибудь подобное.
наверное можно еще так :)
при достижении в 50 дней, сохранить весь аптайм и потом приплюсовать
сохраненную дату к данной.
AA> Возможно в новых операционках (например XP) есть что-нибудь типа
AA> GetTickCountEx (по крайней мере это было бы логично!) с расширенным
AA> максимальным периодом, но не могу подтвердить этот факт, ибо не имею
AA> доступа ни к MSDN, ни к компу с XP в данный момент.
AA> Так что извиняй.
ничего сташного, и на этом спасибо. :)
Hе скучай,_Alexander_. С уважением,Виталий.
Alexander Asyabrik и A. Skrobov сидели дома,пили пиво и болтали на тему _Re[2]:
Аптайм системы_.
AA> нужно вводить отрицательные значения:
AA> CDate(-10) возвратит дату на 10 дней более раннюю чем 30.12.1899.
AA> А отвечал я Vitaliy Pryahin на следующее послание:
VP>> Спасибо, было бы совсем замечательно если бы можно было отобразить это в
VP>> виде: день.часы.минуты. :)
AA> Вряд ли ему подойдет твой вариант. Hе так ли, Vitaly?
к сожалению согласен с Alexander Asyabrik .
Hо все равно я признателен за помощь всем!
Hе скучай,_Alexander_. С уважением,Виталий.
AA> Проанализируем ее: 2 вызова API функции, дробное деление
AA> GetTickCount/86400000 с последующим преобразованием результата к
AA> целому CInt (можно ведь просто GetTickCount \ 86400000) ,
А что, кто-то будет считать аптайм чаще, чем раз в секунду?
Оптимизация нужна только там, где она нужна.
AA> странный формат отображения результата типа 2 days, 12:59:19.
Дело вкуса.
AA> Да и не надо отождествлять число строк кода со сложностью кода. Все
AA> равно компилятор разберет эту твою длинную строку на составляющие.
Мне больше нравится иметь по строке (а не по функции) на задачу. Опять же, дело вкуса.
AA> Не стал бы снова писать, если бы для закрытия этой темы (вроде пора
AA> уже закрывать:) не следовало было бы указать на то, что где-то после
AA> 25 суток функция начнет возвращать отрицательные значения. Конечно
AA> функция об этом знать не будет :), но бейсиковская Long она-то со
AA> знаком и при определенном значении результата будет трактовать
AA> полученное значение как отрицательное. C учетом сказанного код
AA> несколько меняется:
[Sorry, skipped]
AA> Так что тут одной строкой уж точно не отделаешься. Или..?
Легко.
MsgBox IIf(GetTickCount > 0, "Windows up for: " & CInt(GetTickCount / 86400000) & " days, " & _
CDate((GetTickCount Mod 86400000) / 86400000), "Windows up for: " & CInt((4294967296# + _
GetTickCount) / 86400000) & " days, " & CDate(((4294967296# + GetTickCount) / 86400000) _
- Int((4294967296# + GetTickCount) / 86400000)))
Замечу, что вызов GetTickCount - это не более чем чтение системной переменной (вряд ли винда что-то вычисляет при её вызове), так
что лишние временные расходы здесь невелики.
Остаётся, конечно, призрачный шанс, что при первом вызове GetTickCount он был положительным, а при следующих стал отрицательным...
With best regards, A. Skrobov. E-mail: tyom...@r66.ru
--
Вы, было дело, писали 26 мая 2003 г., 13:24:52:
AA>> Да и не надо отождествлять число строк кода со сложностью кода. Все
AA>> равно компилятор разберет эту твою длинную строку на составляющие.
AS> Мне больше нравится иметь по строке (а не по функции) на задачу.
AS> Опять же, дело вкуса.
AS> MsgBox IIf(GetTickCount > 0, "Windows up for: " & CInt(GetTickCount / 86400000) & " days, " & _
AS> CDate((GetTickCount Mod 86400000) / 86400000), "Windows up for: " & CInt((4294967296# + _
AS> GetTickCount) / 86400000) & " days, " & CDate(((4294967296# + GetTickCount) / 86400000) _
AS> - Int((4294967296# + GetTickCount) / 86400000)))
Восхищен и сломлен! Можно мне это в рамку на стене повесить? Почему на
стене? Чтобы эти строчки можно было развернуть в одну все-таки.
Немного омрачает этот праздник жизни тот факт, что при возврате
функцией отрицательных значений более -18167297 мессадж выдает период
в 50 дней и более 12 часов, что в принципе невозможно. Но уже при
значении -18167296 я увидел мессадж с 49 днями и 12 часами. Но что для
нашего родного юзера полсуток-сутки? Так, мелочь. Не стоит оно нашего
внимания. Вполне сгодится погрешность и в одни сутки.
Хотя, опять же, дело вкуса...
--
Alexander
AS>> MsgBox IIf(GetTickCount > 0, "Windows up for: " & CInt(GetTickCount / 86400000) & " days, " & _
AS>> CDate((GetTickCount Mod 86400000) / 86400000), "Windows up for: " & CInt((4294967296# + _
AS>> GetTickCount) / 86400000) & " days, " & CDate(((4294967296# + GetTickCount) / 86400000) _
AS>> - Int((4294967296# + GetTickCount) / 86400000)))
AA> Восхищен и сломлен! Можно мне это в рамку на стене повесить? Почему на
AA> стене? Чтобы эти строчки можно было развернуть в одну все-таки.
Ещё один аргумент в пользу кода из одной строчки: его можно запустить из Immediate Pane.
AA> Немного омрачает этот праздник жизни тот факт, что при возврате
AA> функцией отрицательных значений более -18167297 мессадж выдает период
AA> в 50 дней и более 12 часов, что в принципе невозможно. Но уже при
AA> значении -18167296 я увидел мессадж с 49 днями и 12 часами. Но что для
Ошибка округления... Если заменить CInt на Int, её не будет. Совсем про неё забыл...
Кстати, она случается каждый "полдень", а не только в 49 days 12:00:00, и случалась даже в предыдущей версии (без учёта
отрицательных дат).
Плохо смотрел в тот раз.
AA> нашего родного юзера полсуток-сутки? Так, мелочь. Не стоит оно нашего
AA> внимания. Вполне сгодится погрешность и в одни сутки.
AA> Хотя, опять же, дело вкуса...
Можно было легко пользоваться и тем кодом: время больше 12:00:00 - вычитаем один день... Но это я, конечно, шучу.
"Даже стоящие часы дважды в день показывают верное время" - Твен (кажется)
With best regards, A. Skrobov. E-mail: tyom...@r66.ru
--