Forums -> Флейм -> нужна помощь програмёров
| Full Version

sdandrey

возникла надобность синхронизировать таймер часами в BIOS.надо ето сделать в C++. вопрос в том как ето сделать?.если кто знает,то поделитесь идеями и опытом.спасибо
:rolleyes:
FiL
ничего не понял. Что надо сделать?
sdandrey
QUOTE
ничего не понял. Что надо сделать?

в C ++ делается таймер : обычный цикл. например : for i= 1 to 100.нужно чтоб каждый шаг цикла делался за 0.1 секунды, при чём на любом компе.скорость выполнения цикла зависит от скорости проца.по етому ,чтоб не быть привязаным к конкретному компу надо привязать время выполнения шага цикла к часам в BIOS. проблема собственно в том и состоит как привязать время выполнения шага цикла к часам в BIOS
:rolleyes:
Kastorsky
GetTickCount() спасет отца русской демократии
sdandrey
QUOTE (Kastorsky @ 14-08-2005, 16:58)
GetTickCount() спасет отца русской демократии
спасибо :punk:

так же знающие люди посоветовали поексперементировать с командой SLEEP
Vlady304
QUOTE (sdandrey @ 14-08-2005, 14:14)

так же знающие люди посоветовали поексперементировать с командой SLEEP
О!
Это классная команда. Но с ней надо только на выходные эксперементировать.
Вот я сегодня, например, в час дня проснулся.
sdandrey
и сколько милисекунд длился твой сон? :lol:
код скинь :D
izanoza
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
Sleep не катит, насколько я помню. Глянь к нему описаловку. Если не ошибаюсь то там честно написано, что если дать Sleep(1000), то это не будет точно секунда...
izanoza
A точнее на виндах всё одно не сделать. Поэтому и надо вводить поправки, пытаясь удержаться в пределах нормы. Нужно точнее, устанавливайти ось реального времени, сам я с ними не работал, окромя QNX.
izanoza
Можно конечно не вызывать Sleep(), а крутиться в цикле, получая отметки времени с помощью функции что я привёл, она достаточно точная. Но это 100% загрузка компа, если не делать в этом цикле коротельнких Sleep-ов, например.

Можно наверное ещё какие-нибудь callback-и на таймер повесить и вызывать процедуру, выполняющую нужные действия периодически, но это не попадает под условия исходной задачи. Да и не делал я никогда такого.
sdandrey
мне бы функцию под DOS. т.к железо, которым дання прога должна управлять, дружит только с C++ под DOS
izanoza
Ну тогда только остаётся писать обработчик прерывания 21H, функция 2CH. Но так как часики тикают каждые 18.2 миллисекунды то точность этого таймера невилика, 5-6 показаний времени в секунду. Точнее никак.
sdandrey
QUOTE (izanoza @ 14-08-2005, 19:06)
Ну тогда только остаётся писать обработчик прерывания 21H, функция 2CH. И то точность будет в предела. Но так как часики тикают каждые 18.2 миллисекунды то точность этого таймера невилика, 5-6 показаний времени в секунду. Точнее никак.
izanoza,можешь пример кода кинуть ,если не сложно. :rolleyes:

izanoza
Я никогда на С++ их не программировал, а на ассемблере это было давным-двно, подзабыл уже всё.

Тут в общих чертах про программирование аппаратных прерываний
http://www.megalib.com/books/355/ch4.htm

Здесь в серединке кое-что есть...
http://emanual.ru/download/278-10.html

Погугли, ещё что найдёшь.
sdandrey
QUOTE
Я никогда на С++ их не программировал, а на ассемблере это было давным-двно, подзабыл уже всё.

Тут в общих чертах про программирование аппаратных прерываний
спасибо. :punk:
будем пробовать.
Brait
А зачем именно BIOS'овские часы? Используй software'ные! Вот пример: http://www.azillionmonkeys.com/qed/timer2.txt
sdandrey
QUOTE (Brait @ 15-08-2005, 04:24)
А зачем именно BIOS'овские часы? Используй software'ные! Вот пример: http://www.azillionmonkeys.com/qed/timer2.txt
спасибо. :punk:
ето то что я искал.етот код ,как раз, привязан к часам BIOS :cool:
retro
Мне тоже нужна помощь.
Очень часто слышим банальную фразу: "Запустилась программа самоуничтожения"... А как на самом деле это сделать? Скажем, если в течении десяти дней я это (что-то) не отменил, то оно (вот это) начало работать.
Разумеется, чтобы нигде не было следов присутствия. И что вообще должно быть? Всякие стирания-форматы не пригодны, восстановить легко и просто.
Последствия должны быть радикально-необратимыми. :diablo: Спасибо!
P.S. Пожалуйста, без приколов... На самом деле серьезно.
admik
для уничтожения используются алгоритмы многократной повторной записи на это место на харде всякого мусора (например: криптуем содержимое файла, а потом на это же место на харде его записываем. повтяряем N-ое кол-во раз).
К сожалению сам не писал, использую PGP для этого. вообще-то я видел несколько таких программ, но в итоге я пришел к PGPdisk, это криптованный файл, который умеет демонтироваться из системы после указанного времени простоя. api там открытый, можно из своей программы пользовать его.
retro
admik
Сложновато как-то... Я больше думаю в направлении запуска того же Ghost'a, но только в качестве имиджа может служит пустая (чтобы мгновенно было)юниксовская партиция - сделать с нее имидж и написать скрипт. Шансы потом равны примерно 5-10%, а то и меньше, и с хорошими затратами. Как думаешь?
Ну я, конечно, очень надеюсь на наших софтовиков, т.к. Гост и пр. вред (или бред) - не совсем то, что надо.
P.S. В последнее время уровень кидаловок в Израиле достиг доселе мне
неведанных размеров... :(
admik
retro не овсем понятна цель. если это сервак черный, его нужно прятать так, чтобы до него добрались в последнюю очередь, т.е. он успел отработать свой скрипт на уничтожение. хотя если придут подготовенными, они как правило уже знают где примерно спрятано оборудование с внутренними данными (как говорится: разведка не дремлет).
ты поподробнее напиши, если не хочешь публично, давай в приват.
retro
admik
Нет, все гораздо проще. Намного проще, но и намного неприятнее.
Не платят денег за проделанную работу. И не собираются. Лоханулся по полной. Теперь хочу, наконец, умным стать, да видно, не судьба. :pig:
admik
встроить бэкдор или скрипт "пасхальный" (хе-хе. вот тебе работодатель и Юрьев день) это не выход. нужно думать.
проще ограничить работу программы по времени. способов много. а при полном расчете выдавать им exe без ограничений.
мне нужно больше вводных данных для толкового совета (послушай советы и сделай наоборот :) )
FiL
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 гигов диска затерты достаточно неприятно. Если сделать такое два раза, то цена восстановления может превысить годовой бюджет Израиля :)

Вот обеспечить работу такой комманды - это сложнее. Система сама по себе не очень любит, когда ее стирают :)