Функция GetTickCount, её особенности и проблема 49,7 дней
Как известно, Функция GetTickCount возвращает число миллисекунд, прошедших с момента старта системы, до 49,7 дней
Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days.
Как используются тики?
Обычно с помощью тиков удобно контролировать время выполнения операции, например, выполнение действий по списку, чтобы операция занимала не более 1 секунды:
Также тики могут использовать для определения времени запуска компьютера, другими словами, сколько времени работает компьютер после загрузки.
Особенности GetTickCount
Тики считаются не по одной миллисекунде, а в соответствии с системным таймером, порядка 10-16 миллисекунд.
Тики продолжают считаться, даже если компьютер находится в спящем режиме или в режиме гибернации.
Тики считаются 32-хбитным счётчиком.
Что такое проблема 49,7 дней
Проблема 49,7 дней возникает из-за переполнения 32-хбитного счетчика миллисекунд, который заполняется до 0xffffffff за 49 дней 17 часов , т.е. примерно 49,7 суток.
На самом деле, когда счётчик переполняется, ничего страшного не происходит – просто счётчик начинается снова считать с нуля, но:
- Контроль выполнения операции в этом случае сработает некорректно, т.к. условие GetTickCount() — t
- Точно определить время запуска нельзя, потому что это могло произойти и 49,7 суток тому назад, и 99,4 суток, и даже больше.
Решения проблемы 49,7 дней
Перезагрузка компьютера
Исторически самый старый метод, хорош тем, что не требует модификации программ.
Если перезагружать компьютер планово, например, раз в месяц, то он никогда не доработает до 49,7 суток, соответственно, в проблемную ситуацию не попадёт.
Поскольку сервера обычно работают в графике 24х7, то для них желательно запланировать перезагрузку по расписанию, можно настроить и автоматически, см. Выключение или перезагрузка компьютера из bat файла.
Рабочие станции или ноутбуки редко когда работают без перезагрузки так долго, поэтому проблема 49,7 дней для них и раньше не была так актуальна. А сейчас Майкрософт присылает обновления, которые требуют перезагрузки для установки, поэтому приходится перезагружать чаще, чем раз в месяц.
Использовать 64-битную версию GetTickCount
Функция GetTickCount64 имеет 64-хбитный счётчик.
- Для 64-хбитного счётчика проблемы 49,7 дней не существует в принципе.
- Определение времени старта системы с GetTickCount64 будет корректным.
Функция GetTickCount64 поддерживается только начиная с Windows Vista, а это значит, что программа, использующая GetTickCount64, не заработает в Windows XP.
Делать сравнение с учётом значения счётчика
Сравнение с проверкой того, что 32-хбитный счётчик прошёл через ноль, позволяет получить корректное время выполнения текущей операции и сохранить совместимость с Windows XP.
Опять же, требуется модификация и тестирование используемых программ.
Важно, что при этом всё равно нельзя точно определить время запуска системы!
Стоит ли использовать текущее время для контроля времени выполнения операции?
Теоретически, можно использовать текущее время для контроля времени выполнения, то есть вычислять разницу не между отметками тиков, в между отметками времени.
Но, на практике, присутствует риск корректировки текущего времени между отметками, что может привести к сбою.
Раньше, когда корректировка системных часов выполнялась только вручную и довольно редко, это риск был небольшим.
Сейчас, когда все компьютеры имеют настроенную синхронизацию с сервером времени (ntp сервером), корректировка времени может произойти в разные моменты времени, а это значит, что разница между отметками может оказаться некорректной.
Поэтому лучше использовать именно GetTickCount.
file to hook gettickcount
Рецепты домашней кухни – готовим вкусно и по-домашнему
Fail to hook gettickcount как исправить
10 коммент. к Fail to hook gettickcount как исправить
Сырники с яблоком,да еще и без муки.Как здорово!Обязательно продегустируем,спасибо.
А я никогда сырники с мукой и не готовлю.Мне не нравятся с мукой. Я только с манкой).А вот яблоки не добавляла. Мои домашние хоть так бы ели, и то не всегда с охотой. А с яблоками даже не знаю как пойдут. Вредные родственники это всегда проблема для хозяйки)))).
Вкусные сырники получились. в первый раз готовила с манкой. Яблоки порезала мелкими кусочками. Моим очень понравился десерт)
Весьма оригинальный рецепт сырников. Надо будет попробовать. Творог у меня есть, завтра же куплю яблоки и манку.
Без муки получится гораздо полезнее для организма. Нужно запомнить сырники с творогом и яблоком.
Здорово! У меня не очень получались сырники, если мало муки — разваливаются. Если много — твердые и вкус мучной… Надо по вашему рецепту попробовать — лёгкие какие-то. Обязательно попробую. С тыквой. Тыкву всю зиму в шарлотку вместо яблок кладу. К концу зимы вся семья шарлотку с тыквой за обе щёки уплетает и нахваливает. А в начале нос воротили.
Отличный рецепт полезного завтрака! Уверена, пальчики оближешь) Делаю подобные даже с бананом. С яблоком не менее вкусны!
Классный рецепт, не думал, что в сырники можна что-либо добавлять, кроме творога, а держаться они за счет манки
Fail to hook gettickcount metal gear solid
Автор Алексей осетров задал вопрос в разделе Прочие
При запуске игры на Win 10 Metal Gear Solid V – Ground Zeroes выдает ошибку fail to hook GetTickCount.Что делать? и получил лучший ответ
Ответ от Миямото Мусаси[гуру]Игра пиратка?
Ошибка «программа «Metal Gear Solid V: Ground Zeroes» не работает» может появиться у обладателей операционных систем Windows 10, а также с видеокартами от AMD. К счастью данная проблему можно решить проделав все действия которые указаны ниже.
Решение 1: И так, в первом решении нам необходимо заменить DLL библиотеки в игре.
- Скачайте файл . Файл залит на облако майл, перед загрузкой вы сможете убедиться, что вирусов там нет.
- Далее перейдите в корневую папку игры, примерный путь к игре выглядит так — C:Program Files (x86)SteamsteamappscommonMetal Gear Solid Ground Zeroes
- Переместите в корневую папку игры четыре файла из архива — aticfx32.dll, aticfx64.dll, atidxx32.dll, atidxx64.dll.
- Играем.
Решение 2: Более простое решение, вам необходимо откатить драйвера видеокарты на версию 15.8 Beta. Скачать драйвера AMD 15.8 Beta Driver . Желательно перед установкой удалить уже установленные драйвера на вашем компьютере.
Fail to hook gettickcount windows 10 как исправить
Уважаемые Мастера помогите разобраться. Делаю глобальный hook для отлова нажатия кнопки print screen (исходник брал здесь http://delphiworld.narod.ru/base/hook_keys_full.html ), ловушка работает.
1 на моей форме компоненты edit не хотят обрабатывать нажатие vk_return
procedure TTJDet.Edit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var c:integer;
begin
if key = vk_return then begin
// что-то
end;
2 когда моя прога свернута в панель задач она не обрабатывает сообщение от ловушки
← →
++MASTER++ © ( 2004-11-03 13:06 ) [1]
Попробуй работу в фоне:
Я пишу программу в Delphi, которая каждый час должна проверять размер файла. Это также предполагает, что в случае неактивности приложения оно должно работать сторожевым псом в фоновом режиме win 95 и NT. Как мне сделать это. Вот некоторый исходный код, который должен делать то, что вы хотите. Я его только что создал и еще не успел проверить, но что-то подобное я уже делал, так что это должно работать. Код допускает одно предположение, о котором вы должны отдавать себе отчет. Оно заключается в том, что приложение должно запускатьтся одновременно с Windows (может быть из группы автозапуска), так как код использует GetTickCount, возвращающий в миллисекундах время с момента старта системы, это необходимо для ежечасной инициализац ии кода выполнения задачи. По-моему это то, что вам нужно. Величина, возвращаемая GetTickCount имеет тип DWORD, но Delphi ее хранит как LongInt, поэтому большие значения могут иметь отрицательную величину (после примерно 25 дней). Данный эффект в алгоритм е проверки наступления часа неопределен (я действительно не считал это). Аналогично, значение будет повторяться в цикле каждые 49.7 дней и может появиться другой эффект, когда раз в 49.7 дней в одном реальном часе алгоритм сработает дважды. Надеюсь это ни как не скажется на вашей задаче. Во всяком случае разве это не то, что вы хотели? Успехов!
uses Messages, Windows;
function KeepRunning: Boolean;
var
Msg: TMsg;
begin
Result := True;
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
if (Msg.Message = WM_QUIT) then
Result := False;
DispatchMessage(Msg);
end;
end;
что за работа в фоне?
если кто знает как можно поймать что нажата кнопка print screen (нажата в другой конкретной программе) напишите пожалуста
← →
Almaz © ( 2004-11-05 02:38 ) [3]