Pages: (2) [1] 2  ( Show unread post )

> нужна помощь програмёров
 sdandrey Member is Offline
 Posted: 14-08-2005, 17:34 (post 1, #453730)

Мозговых Дел Мастер

Group: Members
Posts: 5478
Warn:0%-----

возникла надобность синхронизировать таймер часами в BIOS.надо ето сделать в C++. вопрос в том как ето сделать?.если кто знает,то поделитесь идеями и опытом.спасибо
:rolleyes:
PM Email Poster
Top Bottom
 FiL Member is Offline
 Posted: 14-08-2005, 18:13 (post 2, #453749)

Сварливый Мозг Клуба
Group: Roots
Group: Roots
Posts: 22892
ничего не понял. Что надо сделать?
PM Email Poster ICQ AOL MSN
Top Bottom
 sdandrey Member is Offline
 Posted: 14-08-2005, 18:44 (post 3, #453759)

Мозговых Дел Мастер

Group: Members
Posts: 5478
Warn:0%-----
QUOTE
ничего не понял. Что надо сделать?

в C ++ делается таймер : обычный цикл. например : for i= 1 to 100.нужно чтоб каждый шаг цикла делался за 0.1 секунды, при чём на любом компе.скорость выполнения цикла зависит от скорости проца.по етому ,чтоб не быть привязаным к конкретному компу надо привязать время выполнения шага цикла к часам в BIOS. проблема собственно в том и состоит как привязать время выполнения шага цикла к часам в BIOS
:rolleyes:
PM Email Poster
Top Bottom
 Kastorsky Member is Offline
 Posted: 14-08-2005, 19:58 (post 4, #453791)

Newbie

Group: Members
Posts: 44
Warn:0%-----
GetTickCount() спасет отца русской демократии
PM Email Poster
Top Bottom
 sdandrey Member is Offline
 Posted: 14-08-2005, 20:14 (post 5, #453799)

Мозговых Дел Мастер

Group: Members
Posts: 5478
Warn:0%-----
QUOTE (Kastorsky @ 14-08-2005, 16:58)
GetTickCount() спасет отца русской демократии
спасибо :punk:

так же знающие люди посоветовали поексперементировать с командой SLEEP
PM Email Poster
Top Bottom
 Vlady304 Member is Offline
 Posted: 14-08-2005, 20:22 (post 6, #453803)

Кто жизнь познал, тот не спешит
Group: Global Moders
Group: Global Moders
Posts: 10476
QUOTE (sdandrey @ 14-08-2005, 14:14)

так же знающие люди посоветовали поексперементировать с командой SLEEP
О!
Это классная команда. Но с ней надо только на выходные эксперементировать.
Вот я сегодня, например, в час дня проснулся.
PM
Top Bottom
 sdandrey Member is Offline
 Posted: 14-08-2005, 20:30 (post 7, #453810)

Мозговых Дел Мастер

Group: Members
Posts: 5478
Warn:0%-----
и сколько милисекунд длился твой сон? :lol:
код скинь :D
PM Email Poster
Top Bottom
 izanoza Member is Offline
 Posted: 14-08-2005, 21:07 (post 8, #453833)

Мышъ с сыром

Group: Prestige
Posts: 5279
Warn:0%-----
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);



В принципе, ещё желательно учесть время потраченное на сам цикл и время выполнения функций по получению времени, если нужна повышенная точность.
PM Email Poster
Top Bottom
 Bedolaga Member is Offline
 Posted: 14-08-2005, 21:26 (post 9, #453845)

Flooder

Group: Members
Posts: 5248
Warn:0%-----
Sleep не катит, насколько я помню. Глянь к нему описаловку. Если не ошибаюсь то там честно написано, что если дать Sleep(1000), то это не будет точно секунда...
PM Email Poster
Top Bottom
 izanoza Member is Offline
 Posted: 14-08-2005, 21:37 (post 10, #453849)

Мышъ с сыром

Group: Prestige
Posts: 5279
Warn:0%-----
A точнее на виндах всё одно не сделать. Поэтому и надо вводить поправки, пытаясь удержаться в пределах нормы. Нужно точнее, устанавливайти ось реального времени, сам я с ними не работал, окромя QNX.
PM Email Poster
Top Bottom
 izanoza Member is Offline
 Posted: 14-08-2005, 21:43 (post 11, #453855)

Мышъ с сыром

Group: Prestige
Posts: 5279
Warn:0%-----
Можно конечно не вызывать Sleep(), а крутиться в цикле, получая отметки времени с помощью функции что я привёл, она достаточно точная. Но это 100% загрузка компа, если не делать в этом цикле коротельнких Sleep-ов, например.

Можно наверное ещё какие-нибудь callback-и на таймер повесить и вызывать процедуру, выполняющую нужные действия периодически, но это не попадает под условия исходной задачи. Да и не делал я никогда такого.
PM Email Poster
Top Bottom
 sdandrey Member is Offline
 Posted: 14-08-2005, 21:55 (post 12, #453860)

Мозговых Дел Мастер

Group: Members
Posts: 5478
Warn:0%-----
мне бы функцию под DOS. т.к железо, которым дання прога должна управлять, дружит только с C++ под DOS
PM Email Poster
Top Bottom
 izanoza Member is Offline
 Posted: 14-08-2005, 22:06 (post 13, #453864)

Мышъ с сыром

Group: Prestige
Posts: 5279
Warn:0%-----
Ну тогда только остаётся писать обработчик прерывания 21H, функция 2CH. Но так как часики тикают каждые 18.2 миллисекунды то точность этого таймера невилика, 5-6 показаний времени в секунду. Точнее никак.
PM Email Poster
Top Bottom
 sdandrey Member is Offline
 Posted: 14-08-2005, 22:11 (post 14, #453870)

Мозговых Дел Мастер

Group: Members
Posts: 5478
Warn:0%-----
QUOTE (izanoza @ 14-08-2005, 19:06)
Ну тогда только остаётся писать обработчик прерывания 21H, функция 2CH. И то точность будет в предела. Но так как часики тикают каждые 18.2 миллисекунды то точность этого таймера невилика, 5-6 показаний времени в секунду. Точнее никак.
izanoza,можешь пример кода кинуть ,если не сложно. :rolleyes:

PM Email Poster
Top Bottom
 izanoza Member is Offline
 Posted: 14-08-2005, 22:23 (post 15, #453873)

Мышъ с сыром

Group: Prestige
Posts: 5279
Warn:0%-----
Я никогда на С++ их не программировал, а на ассемблере это было давным-двно, подзабыл уже всё.

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

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

Погугли, ещё что найдёшь.
PM Email Poster
Top Bottom
Topic Options Pages: (2) [1] 2