sdandrey
@ 14-08-2005, 17:34
возникла надобность синхронизировать таймер часами в BIOS.надо ето сделать в C++. вопрос в том как ето сделать?.если кто знает,то поделитесь идеями и опытом.спасибо
:rolleyes:
ничего не понял. Что надо сделать?
sdandrey
@ 14-08-2005, 18:44
QUOTE |
ничего не понял. Что надо сделать? |
в C ++ делается таймер : обычный цикл. например : for i= 1 to 100.нужно чтоб каждый шаг цикла делался за 0.1 секунды, при чём на любом компе.скорость выполнения цикла зависит от скорости проца.по етому ,чтоб не быть привязаным к конкретному компу надо привязать время выполнения шага цикла к часам в BIOS. проблема собственно в том и состоит как привязать время выполнения шага цикла к часам в BIOS
:rolleyes:
Kastorsky
@ 14-08-2005, 19:58
GetTickCount() спасет отца русской демократии
sdandrey
@ 14-08-2005, 20:14
QUOTE (Kastorsky @ 14-08-2005, 16:58) |
GetTickCount() спасет отца русской демократии |
спасибо :punk:
так же знающие люди посоветовали поексперементировать с командой SLEEP
Vlady304
@ 14-08-2005, 20:22
QUOTE (sdandrey @ 14-08-2005, 14:14) |
так же знающие люди посоветовали поексперементировать с командой SLEEP |
О!
Это классная команда. Но с ней надо только на выходные эксперементировать.
Вот я сегодня, например, в час дня проснулся.
sdandrey
@ 14-08-2005, 20:30
и сколько милисекунд длился твой сон? :lol:
код скинь :D
izanoza
@ 14-08-2005, 21:07
QUOTE (Kastorsky @ 14-08-2005, 11:58) |
GetTickCount() спасет отца русской демократии |
Для Windows правильнее использовать QueryPerformanceCounter(), она более точная :) Вот пример кода.
CODE |
double GetTimeMark() static double freq; static bool first = true; if ( first ) { LARGE_INTEGER nfreq; QueryPerformanceFrequency(&nfreq); freq = double(nfreq.QuadPart); first = false; }
if ( !QueryPerformanceCounter(&bigint) ) { return 0.0; } return double(bigint.QuadPart) / freq; }
|
Это для винды. Для Юникса использовать gettimeofday(), там всё элементарно.
Отмечаешь в начале цикла текущее время, потом делаешь что тебе нужно, потом опять получаешь отметку времени, если разница меньше твоей 0.1 секунды, делаешь Sleep() на остаток времени, параметр у него в миллисекундах, поэтому переведёшь секунды в ms сам. Винды точнее спать не умеют.
Для Юникса легче всего использовать select().
CODE |
const long kMicroSecondsPerSecond = 1000000;
struct timeval delay; delay.tv_sec = micro_sec / kMicroSecondsPerSecond; delay.tv_usec = micro_sec % kMicroSecondsPerSecond; select(0, (fd_set*) 0, (fd_set*) 0, (fd_set*) 0, &delay);
|
В принципе, ещё желательно учесть время потраченное на сам цикл и время выполнения функций по получению времени, если нужна повышенная точность.
Bedolaga
@ 14-08-2005, 21:26
Sleep не катит, насколько я помню. Глянь к нему описаловку. Если не ошибаюсь то там честно написано, что если дать Sleep(1000), то это не будет точно секунда...
izanoza
@ 14-08-2005, 21:37
A точнее на виндах всё одно не сделать. Поэтому и надо вводить поправки, пытаясь удержаться в пределах нормы. Нужно точнее, устанавливайти ось реального времени, сам я с ними не работал, окромя QNX.
izanoza
@ 14-08-2005, 21:43
Можно конечно не вызывать Sleep(), а крутиться в цикле, получая отметки времени с помощью функции что я привёл, она достаточно точная. Но это 100% загрузка компа, если не делать в этом цикле коротельнких Sleep-ов, например.
Можно наверное ещё какие-нибудь callback-и на таймер повесить и вызывать процедуру, выполняющую нужные действия периодически, но это не попадает под условия исходной задачи. Да и не делал я никогда такого.
sdandrey
@ 14-08-2005, 21:55
мне бы функцию под DOS. т.к железо, которым дання прога должна управлять, дружит только с C++ под DOS
izanoza
@ 14-08-2005, 22:06
Ну тогда только остаётся писать обработчик прерывания 21H, функция 2CH. Но так как часики тикают каждые 18.2 миллисекунды то точность этого таймера невилика, 5-6 показаний времени в секунду. Точнее никак.
sdandrey
@ 14-08-2005, 22:11
QUOTE (izanoza @ 14-08-2005, 19:06) |
Ну тогда только остаётся писать обработчик прерывания 21H, функция 2CH. И то точность будет в предела. Но так как часики тикают каждые 18.2 миллисекунды то точность этого таймера невилика, 5-6 показаний времени в секунду. Точнее никак. |
izanoza,можешь пример кода кинуть ,если не сложно. :rolleyes:
izanoza
@ 14-08-2005, 22:23
Я никогда на С++ их не программировал, а на ассемблере это было давным-двно, подзабыл уже всё.
Тут в общих чертах про программирование аппаратных прерываний
http://www.megalib.com/books/355/ch4.htmЗдесь в серединке кое-что есть...
http://emanual.ru/download/278-10.htmlПогугли, ещё что найдёшь.
sdandrey
@ 14-08-2005, 22:33
QUOTE |
Я никогда на С++ их не программировал, а на ассемблере это было давным-двно, подзабыл уже всё.
Тут в общих чертах про программирование аппаратных прерываний |
спасибо. :punk:
будем пробовать.
Brait
@ 15-08-2005, 07:24
А зачем именно BIOS'овские часы? Используй software'ные! Вот пример:
http://www.azillionmonkeys.com/qed/timer2.txt
sdandrey
@ 15-08-2005, 08:08
спасибо. :punk:
ето то что я искал.етот код ,как раз, привязан к часам BIOS :cool:
retro
@ 15-08-2005, 09:11
Мне тоже нужна помощь.
Очень часто слышим банальную фразу: "Запустилась программа самоуничтожения"... А как на самом деле это сделать? Скажем, если в течении десяти дней я это (что-то) не отменил, то оно (вот это) начало работать.
Разумеется, чтобы нигде не было следов присутствия. И что вообще должно быть? Всякие стирания-форматы не пригодны, восстановить легко и просто.
Последствия должны быть радикально-необратимыми. :diablo: Спасибо!
P.S. Пожалуйста, без приколов... На самом деле серьезно.
admik
@ 15-08-2005, 11:51
для уничтожения используются алгоритмы многократной повторной записи на это место на харде всякого мусора (например: криптуем содержимое файла, а потом на это же место на харде его записываем. повтяряем N-ое кол-во раз).
К сожалению сам не писал, использую PGP для этого. вообще-то я видел несколько таких программ, но в итоге я пришел к PGPdisk, это криптованный файл, который умеет демонтироваться из системы после указанного времени простоя. api там открытый, можно из своей программы пользовать его.
retro
@ 15-08-2005, 12:40
admik
Сложновато как-то... Я больше думаю в направлении запуска того же Ghost'a, но только в качестве имиджа может служит пустая (чтобы мгновенно было)юниксовская партиция - сделать с нее имидж и написать скрипт. Шансы потом равны примерно 5-10%, а то и меньше, и с хорошими затратами. Как думаешь?
Ну я, конечно, очень надеюсь на наших софтовиков, т.к. Гост и пр. вред (или бред) - не совсем то, что надо.
P.S. В последнее время уровень кидаловок в Израиле достиг доселе мне
неведанных размеров... :(
admik
@ 15-08-2005, 12:49
retro не овсем понятна цель. если это сервак черный, его нужно прятать так, чтобы до него добрались в последнюю очередь, т.е. он успел отработать свой скрипт на уничтожение. хотя если придут подготовенными, они как правило уже знают где примерно спрятано оборудование с внутренними данными (как говорится: разведка не дремлет).
ты поподробнее напиши, если не хочешь публично, давай в приват.
retro
@ 15-08-2005, 12:56
admik
Нет, все гораздо проще. Намного проще, но и намного неприятнее.
Не платят денег за проделанную работу. И не собираются. Лоханулся по полной. Теперь хочу, наконец, умным стать, да видно, не судьба. :pig:
admik
@ 15-08-2005, 13:08
встроить бэкдор или скрипт "пасхальный" (хе-хе. вот тебе работодатель и Юрьев день) это не выход. нужно думать.
проще ограничить работу программы по времени. способов много. а при полном расчете выдавать им exe без ограничений.
мне нужно больше вводных данных для толкового совета (послушай советы и сделай наоборот :) )
QUOTE (retro @ 15-08-2005, 06:40) |
admik Сложновато как-то... Я больше думаю в направлении запуска того же Ghost'a, но только в качестве имиджа может служит пустая (чтобы мгновенно было)юниксовская партиция - сделать с нее имидж и написать скрипт. Шансы потом равны примерно 5-10%, а то и меньше, и с хорошими затратами. Как думаешь? Ну я, конечно, очень надеюсь на наших софтовиков, т.к. Гост и пр. вред (или бред) - не совсем то, что надо. P.S. В последнее время уровень кидаловок в Израиле достиг доселе мне неведанных размеров... :( |
dd if=/dev/zero of=/dev/hda bs=1048576 count=10240
И первые 10 гигов диска затерты достаточно неприятно. Если сделать такое два раза, то цена восстановления может превысить годовой бюджет Израиля :)
Вот обеспечить работу такой комманды - это сложнее. Система сама по себе не очень любит, когда ее стирают :)