Таймер и задержки выполнения (Delay) Delphi — среда быстрой разработки, где в качестве языка программирования используется Object Pascal. На сегодняшний день позволяет разрабатывать ПО для Microsoft Windows, Mac OS, iOS и Android и входит в состав Embarcadero RAD Studio https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay.feed 2022-09-13T05:01:41+07:00 Delphi help info@delphi-hlp.ru Joomla! - Open Source Content Management Использование команды RDTSC процессора Pentium для работы с малыми временными интервалам 2013-09-16T14:38:14+07:00 2013-09-16T14:38:14+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/ispolzovanie-komandy-rdtsc-protsessora-pentium-dlya-raboty-s-malymi-vremennymi-intervalam.html Super User toto44@inbox.ru <p>Автор: Шевченко В.В.</p> <p> </p> <p>Приветствую Вас, жители королевства!</p> <p>В одной толстой книге нашел интересное использование команды RDTSC процессора Pentium для работы с малыми временными интервалами. Я думаю, что эта функция может найти широкое применение (в таймерах, управлении внешними устройствами, научных исследованиях).</p> <p> </p> <p>Этот счетчик увеличивается на 1 на каждом такте CPU.</p> <p>Он стартует при включении компьютера или при нажатии кнопки RESET.</p> <p>Обычно функцию RDTSC используют при определении тактовой частоты процессора.</p> <p>Применяя программные ухищрения можно добиться измерения очень малых временных величин в реальном масштабе времени или применять для калибровки таймеров (предварительно определив при помощи этой же функции тактовую частоту процессора).</p> <p>Готовые примеры определения тактовой частоты при помощи функции RDTSC есть в интернете, например, на сайте Мастера Delphi" : "Скорость работы процессора, точный таймер"</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RDTSC: comp;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TimeStamp: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">record</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">: (Whole: comp);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">: (Lo, Hi: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db </span><span class="f_CodeExample" style="color: #800000;">$0F</span><span class="f_CodeExample" style="color: #000000;">; db </span><span class="f_CodeExample" style="color: #800000;">$31</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ifdef Cpu386}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [TimeStamp.Lo], eax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [TimeStamp.Hi], edx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$else}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db D32</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov word ptr TimeStamp.Lo, AX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db D32</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov word ptr TimeStamp.Hi, DX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$endif}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := TimeStamp.Whole;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;">©</span><span style="font-family: 'Courier New'; color: #ff6600; font-size: 8pt; font-weight: bold;">Drkb::00686</span></p> <p>https://delphiworld.narod</p> <p>Автор: Шевченко В.В.</p> <p> </p> <p>Приветствую Вас, жители королевства!</p> <p>В одной толстой книге нашел интересное использование команды RDTSC процессора Pentium для работы с малыми временными интервалами. Я думаю, что эта функция может найти широкое применение (в таймерах, управлении внешними устройствами, научных исследованиях).</p> <p> </p> <p>Этот счетчик увеличивается на 1 на каждом такте CPU.</p> <p>Он стартует при включении компьютера или при нажатии кнопки RESET.</p> <p>Обычно функцию RDTSC используют при определении тактовой частоты процессора.</p> <p>Применяя программные ухищрения можно добиться измерения очень малых временных величин в реальном масштабе времени или применять для калибровки таймеров (предварительно определив при помощи этой же функции тактовую частоту процессора).</p> <p>Готовые примеры определения тактовой частоты при помощи функции RDTSC есть в интернете, например, на сайте Мастера Delphi" : "Скорость работы процессора, точный таймер"</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RDTSC: comp;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TimeStamp: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">record</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">: (Whole: comp);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">: (Lo, Hi: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db </span><span class="f_CodeExample" style="color: #800000;">$0F</span><span class="f_CodeExample" style="color: #000000;">; db </span><span class="f_CodeExample" style="color: #800000;">$31</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ifdef Cpu386}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [TimeStamp.Lo], eax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [TimeStamp.Hi], edx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$else}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db D32</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov word ptr TimeStamp.Lo, AX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db D32</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov word ptr TimeStamp.Hi, DX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$endif}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := TimeStamp.Whole;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;">©</span><span style="font-family: 'Courier New'; color: #ff6600; font-size: 8pt; font-weight: bold;">Drkb::00686</span></p> <p>https://delphiworld.narod</p> Как отчитывать промежутки времени с точностью, большей чем 60 мсек? 2013-09-16T14:22:30+07:00 2013-09-16T14:22:30+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/kak-otchityvat-promezhutki-vremeni-s-tochnostyu-bolshej-chem-60-msek.html Super User toto44@inbox.ru <p><span style="font-family: 'Times New Roman'; color: #000000;">Для начала описываешь процедуру, которая будет вызываться по сообщению от таймера :</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD);</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Тело процедуры.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">а дальше в программе (например по нажатию кнопки) создаешь Таймер и вешаешь на него созданную процедуру</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">uTimerID:=timeSetEvent(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">500</span><span class="f_CodeExample" style="color: #000000;">,@FNTimeCallBack,</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #000000;">,TIME_PERIODIC); </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">Подробности смотри в Help.Hу и в конце убиваешь таймер:</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timeKillEvent(uTimerID); </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">И все. Точность этого способа до 1 мсек. минимальный интервал времени можно задавать 1 мсек.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">Автор: Leonid Tserling</span></p> <p><span style="font-family: 'Times New Roman'; color: #000000;">Для начала описываешь процедуру, которая будет вызываться по сообщению от таймера :</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD);</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Тело процедуры.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">а дальше в программе (например по нажатию кнопки) создаешь Таймер и вешаешь на него созданную процедуру</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">uTimerID:=timeSetEvent(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">500</span><span class="f_CodeExample" style="color: #000000;">,@FNTimeCallBack,</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #000000;">,TIME_PERIODIC); </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">Подробности смотри в Help.Hу и в конце убиваешь таймер:</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timeKillEvent(uTimerID); </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">И все. Точность этого способа до 1 мсек. минимальный интервал времени можно задавать 1 мсек.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000;">Автор: Leonid Tserling</span></p> Как реализовать сверхточный таймер? 2013-08-22T20:50:28+07:00 2013-08-22T20:50:28+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/kak-realizovat-sverkhtochnyj-tajmer.html Super User toto44@inbox.ru <p>Windows is not a real time operating system so it is not really able to reliably achieve high accuracy timing without using a device driver. The best I have been able to get is a few nanoseconds using QueryPerformanceCounter. This is the procedure I use:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WaitCal: Int64;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Wait(ns: Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Counter, Freq, WaitUntil: Int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> QueryPerformanceCounter(Counter) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> QueryPerformanceFrequency(Freq);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WaitUntil := Counter + WaitCal + (ns * (Freq </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> Counter &lt; WaitUntil </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> QueryPerformanceCounter(Counter);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sleep(ns </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><span style="color: #000000;">To get improved accuracy do this a little while before using Wait()</span></p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Start, Finish: Int64;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Sleep(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">QueryPerformanceCounter(Start);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Wait(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">QueryPerformanceCounter(Finish);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WaitCal := Start - Finish;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><span style="color: #000000;">A trick I have found to increase the reliability of this on my computer is to call Wait like this:</span></p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Sleep(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DoSomething;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Wait(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DoSomethingElse;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято из </span><span style="font-family: 'Courier New CYR'; color: #ff0000; font-size: 10pt;">https://www.lmc-mediaagentur</span></p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Unit</span><span class="f_CodeExample" style="color: #000000;"> Counter; (* Written by Jin *)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$O-,F-,S-,N-,R-,Q-}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> tTimerValue = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">record</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Micro: Word; </span><span class="f_CodeExample" style="color: #000080;">{ Счётчик 8253/8254 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Counter: Longint </span><span class="f_CodeExample" style="color: #000080;">{ Счётчик BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MicroFreq = </span><span class="f_CodeExample" style="color: #800000;">1193181</span><span class="f_CodeExample" style="color: #000080;">{ $1234DD }</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ Частота обновления счётчика Micro (1/сек) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CounterFreq = MicroFreq / </span><span class="f_CodeExample" style="color: #800000;">65536</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ Частота обновления счётчика Counter (1/сек) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MicroInterval = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> / MicroFreq; </span><span class="f_CodeExample" style="color: #000080;">{ Интервал обновления счётчика Micro (сек) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CounterInterval = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> / CounterFreq; </span><span class="f_CodeExample" style="color: #000080;">{ Интервал обновления счётчика Counter (сек) }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BIOSCounter: Longint </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #800000;">$0040</span><span class="f_CodeExample" style="color: #000000;">:</span><span class="f_CodeExample" style="color: #800000;">$006C</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Системный счётчик (обновляется CounterFreq раз/сек, }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ то есть каждые CounterInterval секунд) }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> InitTimer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Инициализировать таймер (перевести в нужный режим работы). }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Эту процедуру необходимо выполнять перед использованием функций }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ и процедур для получения значения таймера (или счётчика), если }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Вы в своей программе изменили режим работы таймера. В противном }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ случае эта процедура Вам не понадобится, так как она выполняется }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ в секции инициализации модуля (сразу после запуска программы) ! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Записать значение таймера в переменную Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerSec: Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение таймера в секундах (с точностью до 1 мкс) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение таймера в миллисекундах }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Older, Newer, Result: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Записать разницу значений Newer и Older в переменную Result }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifSec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Older, Newer: tTimerValue): Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить разницу значений Newer и Older в секундах }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifMillisec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Older, Newer: tTimerValue): Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить разницу значений Newer и Older в миллисекундах }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Sec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue): Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить количество секунд по значению переменной Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Millisec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue): Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить количество миллисекунд по значению переменной Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvSec2Timer(Sec: Real; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Преобразовать значение секунд Sec типа Real в тип tTimerValue }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvMillisec2Timer(Millisec: Longint; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Преобразовать значение миллисекунд Millisec типа Longint в тип tTimerValue }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Сбросить счётчик (то есть принять текущее значение таймера за ноль для }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ процедуры GetCounterValue и функции GetCounterSec) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetCounterValue(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Записать значение счётчика в переменную Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterSec: Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение секунд счётчика }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterMillisec: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение миллисекунд счётчика }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(MS: Word);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Задержка MS миллисекунд (1 сек = 1000 мс) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> DelaySec(Sec: Real);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Задержка Sec секунд }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay(N: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Задержка N * MicroInterval секунд (приближённо N * 0.838095813 мкс). }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Если Вам нужны наиболее точные короткие задержки, лучше использовать }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ эту процедуру, так как она даёт наименьшую погрешность по сравнению }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ с двумя предыдущими процедурами. }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Implementation</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Now: tTimerValue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: tTimerValue;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> InitTimer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,34h </span><span class="f_CodeExample" style="color: #000080;">{ Режим 2 таймера 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 43h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> al,al </span><span class="f_CodeExample" style="color: #000080;">{ 65536 циклов до IRQ }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerValue; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> ax,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov es,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov bx,46Ch </span><span class="f_CodeExample" style="color: #000080;">{ DS:BX = 0000h:046Ch = Таймер BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cli</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov dx,es:[bx]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov cx,es:[bx+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span><span class="f_CodeExample" style="color: #000080;">{ CX:DX = Первое значение таймера BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sti</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 43h,al </span><span class="f_CodeExample" style="color: #000080;">{ Замораживаем таймер 8253/8254 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cli</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov si,es:[bx]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov di,es:[bx+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span><span class="f_CodeExample" style="color: #000080;">{ DI:SI = Второе значение таймера BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,40h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,40h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sti</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ah,al </span><span class="f_CodeExample" style="color: #000080;">{ AX = Таймер 8253/8254 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> ax </span><span class="f_CodeExample" style="color: #000080;">{ Обратный отсчёт -&gt; Прямой отсчёт }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp dx,si </span><span class="f_CodeExample" style="color: #000080;">{ Первое значение таймера BIOS равно второму значению ? }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> je @Ok </span><span class="f_CodeExample" style="color: #000080;">{ Да! Оставляем как есть (CX:DX), иначе... }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> ax,ax </span><span class="f_CodeExample" style="color: #000080;">{ Таймер BIOS изменился после заморозки таймера 8253/8254 (между OUT и CLI) ? }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> js @Ok </span><span class="f_CodeExample" style="color: #000080;">{ Да! Оставляем как есть (CX:DX), иначе... }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov dx,si</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov cx,di </span><span class="f_CodeExample" style="color: #000080;">{ CX:DX = DI:SI, если таймер BIOS изменился между STI и OUT }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Ok:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> les di,Timer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Low Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,dx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Middle Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ High Word - Записаны из CX:DX:AX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerSec := ConvTimer2Sec(Now)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec := Trunc(GetTimerSec*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lds si,Newer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsw </span><span class="f_CodeExample" style="color: #000080;">{ Low Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg cx,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsw </span><span class="f_CodeExample" style="color: #000080;">{ Middle Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg dx,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsw </span><span class="f_CodeExample" style="color: #000080;">{ High Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg cx,ax </span><span class="f_CodeExample" style="color: #000080;">{ Прочитаны в CX:DX:AX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lds si,Older</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub ax,[si]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sbb dx,[si+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sbb cx,[si+</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем Older из Newer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> les di,Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Low Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,dx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Middle Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ High Word - Записано из CX:DX:AX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Older, Newer, Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifSec := ConvTimer2Sec(Now)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifMillisec := Trunc(GetTimerDifSec(Older, Newer)*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Sec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Sec := (Timer.Counter*</span><span class="f_CodeExample" style="color: #800000;">65536</span><span class="f_CodeExample" style="color: #000000;"> + Timer.Micro) / MicroFreq</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Millisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Millisec := Trunc(ConvTimer2Sec(Timer)*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvSec2Timer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Counter := Trunc(Sec * CounterFreq);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Micro := Trunc(Sec * MicroFreq) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">mod</span><span class="f_CodeExample" style="color: #800000;">65536</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvMillisec2Timer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Counter := Trunc(Millisec/</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;"> * CounterFreq);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Micro := Trunc(Millisec/</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;"> * MicroFreq) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">mod</span><span class="f_CodeExample" style="color: #800000;">65536</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Zero)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetCounterValue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Timer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Zero, Timer, Timer)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Zero, Now, Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetCounterSec := ConvTimer2Sec(Now)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetCounterMillisec := Trunc(GetCounterSec*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> MS &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Zero := GetTimerMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Until</span><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec-Zero &gt;= MS</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> DelaySec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> Sec &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Zero := GetTimerSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Until</span><span class="f_CodeExample" style="color: #000000;"> GetTimerSec-Zero &gt;= Sec</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Label</span><span class="f_CodeExample" style="color: #000000;"> Check;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: tTimerValue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> N &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Zero);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Check:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Zero, Now, Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,word ptr Now</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov dx,word ptr Now+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">{ DX:AX - Прошедшее время }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ mov cx,word ptr Now+4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> or cx,cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> jnz @Exit}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp dx,word ptr N+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">{ Проверяем старшие слова }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb Check</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ax,word ptr N </span><span class="f_CodeExample" style="color: #000080;">{ Проверяем младшие слова }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb Check</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Exit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> EndEnd;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> InitTimer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p style="margin: 7px 0px;"><br /><span style="font-family: 'Times New Roman'; color: #000000;">И</span><span style="font-family: 'Times New Roman'; color: #000000;">вот</span><span style="font-family: 'Times New Roman'; color: #000000;">ещё</span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">:</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Uses</span><span class="f_CodeExample" style="color: #000000;"> Counter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Ans: Char;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec: Real;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,0Dh</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 21h </span><span class="f_CodeExample" style="color: #000080;">{ Сбрасываем кэш }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1681h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Запрещаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Без задержки...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000 раз холостой цикл...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #000000;"> ;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000 раз по 0 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">'-------------------------------------------------'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1 раз 1 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000 раз по 0.001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'10000 раз по 0.0001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">10000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">0001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'100000 раз по 0.00001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">100000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">00001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'119318 раз по 1/119318.1 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">119318</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MDelay(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">'-------------------------------------------------'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Запускать тесты по микросекундам (м.б. очень долгими) [Y/N] ? : '</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> ah,ah</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 16h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> al,20h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp al,</span><span class="f_CodeExample" style="color: #ff0000;">'y'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> je @Ok</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp al,</span><span class="f_CodeExample" style="color: #ff0000;">'n'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Ok:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Ans,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(Ans);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> Ans = </span><span class="f_CodeExample" style="color: #ff0000;">'y'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000000 раз по 0.000001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">000001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1193181 раз по 1/1193181 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1193181</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MDelay(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1682h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Разрешаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> EndEnd.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p style="margin: 7px 0px;"><br /><span style="font-family: 'Times New Roman'; color: #000000;">Не</span><span style="font-family: 'Times New Roman'; color: #000000;">забывайте</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">что</span><span style="font-family: 'Times New Roman'; color: #000000;">погрешности</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">которые</span><span style="font-family: 'Times New Roman'; color: #000000;">будет</span><span style="font-family: 'Times New Roman'; color: #000000;">выдавать</span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">будут</span><span style="font-family: 'Times New Roman'; color: #000000;">из</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">за</span><span style="font-family: 'Times New Roman'; color: #000000;">того</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">что</span><span style="font-family: 'Times New Roman'; color: #000000;">какое</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">то</span><span style="font-family: 'Times New Roman'; color: #000000;">время</span><span style="font-family: 'Times New Roman'; color: #000000;">тратиться</span><span style="font-family: 'Times New Roman'; color: #000000;">на</span><span style="font-family: 'Times New Roman'; color: #000000;">вызов</span><span style="font-family: 'Times New Roman'; color: #000000;">процедуры</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">циклы</span><span style="font-family: 'Times New Roman'; color: #000000;">и</span><span style="font-family: 'Times New Roman'; color: #000000;">т</span><span style="font-family: 'Times New Roman'; color: #000000;">.</span><span style="font-family: 'Times New Roman'; color: #000000;">д</span><span style="font-family: 'Times New Roman'; color: #000000;">. (</span><span style="font-family: 'Times New Roman'; color: #000000;">т</span><span style="font-family: 'Times New Roman'; color: #000000;">.</span><span style="font-family: 'Times New Roman'; color: #000000;">к</span><span style="font-family: 'Times New Roman'; color: #000000;">. </span><span style="font-family: 'Times New Roman'; color: #000000;">там</span><span style="font-family: 'Times New Roman'; color: #000000;">используются</span><span style="font-family: 'Times New Roman'; color: #000000;">процедуры</span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">DelaySec</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">MDelay</span><span style="font-family: 'Times New Roman'; color: #000000;">).... </span><span style="font-family: 'Times New Roman'; color: #000000;">Но</span><span style="font-family: 'Times New Roman'; color: #000000;">если</span><span style="font-family: 'Times New Roman'; color: #000000;">вызвать</span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">ResetCounter</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">а</span><span style="font-family: 'Times New Roman'; color: #000000;">через</span><span style="font-family: 'Times New Roman'; color: #000000;">некоторое</span><span style="font-family: 'Times New Roman'; color: #000000;">время</span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">GetCounterSec</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">то</span><span style="font-family: 'Times New Roman'; color: #000000;">результат</span><span style="font-family: 'Times New Roman'; color: #000000;">будет</span><span style="font-family: 'Times New Roman'; color: #000000;">точным</span><span style="font-family: 'Times New Roman'; color: #000000;"> (</span><span style="font-family: 'Times New Roman'; color: #000000;">собственно</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">именно</span><span style="font-family: 'Times New Roman'; color: #000000;">так</span><span style="font-family: 'Times New Roman'; color: #000000;">здесь</span><span style="font-family: 'Times New Roman'; color: #000000;">и</span><span style="font-family: 'Times New Roman'; color: #000000;">измеряются</span><span style="font-family: 'Times New Roman'; color: #000000;">погрешности</span><span style="font-family: 'Times New Roman'; color: #000000;">)! </span><span style="font-family: 'Times New Roman'; color: #000000;">И</span><span style="font-family: 'Times New Roman'; color: #000000;">можно</span><span style="font-family: 'Times New Roman'; color: #000000;">вызывать</span><span style="font-family: 'Times New Roman'; color: #000000;">его</span><span style="font-family: 'Times New Roman'; color: #000000;"> (GetCounterSec) </span><span style="font-family: 'Times New Roman'; color: #000000;">ещё</span><span style="font-family: 'Times New Roman'; color: #000000;">хоть</span><span style="font-family: 'Times New Roman'; color: #000000;"> 10000 </span><span style="font-family: 'Times New Roman'; color: #000000;">раз</span><span style="font-family: 'Times New Roman'; color: #000000;">! ;D</span><br /><span style="font-family: 'Times New Roman'; color: #000000;">Кстати</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">запускайте</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">только</span><span style="font-family: 'Times New Roman'; color: #000000;">в</span><span style="font-family: 'Times New Roman'; color: #000000;">полноэкранном</span><span style="font-family: 'Times New Roman'; color: #000000;">режиме</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">т</span><span style="font-family: 'Times New Roman'; color: #000000;">.</span><span style="font-family: 'Times New Roman'; color: #000000;">к</span><span style="font-family: 'Times New Roman'; color: #000000;">. </span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">отключает</span><span style="font-family: 'Times New Roman'; color: #000000;">многозадачность</span><span style="font-family: 'Times New Roman'; color: #000000;"> Windows, </span><span style="font-family: 'Times New Roman'; color: #000000;">и</span><span style="font-family: 'Times New Roman'; color: #000000;">на</span><span style="font-family: 'Times New Roman'; color: #000000;">экране</span><span style="font-family: 'Times New Roman'; color: #000000;">вы</span><span style="font-family: 'Times New Roman'; color: #000000;">ничего</span><span style="font-family: 'Times New Roman'; color: #000000;">не</span><span style="font-family: 'Times New Roman'; color: #000000;">увидите</span><span style="font-family: 'Times New Roman'; color: #000000;"> (</span><span style="font-family: 'Times New Roman'; color: #000000;">будет</span><span style="font-family: 'Times New Roman'; color: #000000;">впечатление</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">что</span><span style="font-family: 'Times New Roman'; color: #000000;">прога</span><span style="font-family: 'Times New Roman'; color: #000000;">повисла</span><span style="font-family: 'Times New Roman'; color: #000000;">). </span></p> <p style="margin: 7px 0px;"> </p> <p>Автор: 7jin</p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято из </span><span style="color: #0000ff; font-size: 10pt; font-weight: bold; text-decoration: underline;">https://forum.sources</span></p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <p style="margin: 7px 0px;"><span style="font-family: 'Times New Roman'; color: #000000;">А</span><span style="font-family: 'Times New Roman'; color: #000000;">вот</span><span style="font-family: 'Times New Roman'; color: #000000;">ещё</span><span style="font-family: 'Times New Roman'; color: #000000;">один</span><span style="font-family: 'Times New Roman'; color: #000000;">способ</span><span style="font-family: 'Times New Roman'; color: #000000;"> (</span><span style="font-family: 'Times New Roman'; color: #000000;">работает</span><span style="font-family: 'Times New Roman'; color: #000000;">только</span><span style="font-family: 'Times New Roman'; color: #000000;">на</span><span style="font-family: 'Times New Roman'; color: #000000;"> Pentium </span><span style="font-family: 'Times New Roman'; color: #000000;">или</span><span style="font-family: 'Times New Roman'; color: #000000;">выше</span><span style="font-family: 'Times New Roman'; color: #000000;">)....</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Unit</span><span class="f_CodeExample" style="color: #000000;"> TSCDelay; (* Работает только на Pentium (и то не всегда ;) *)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$O-,F-,G+,S-,R-}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CPUClock: Longint; </span><span class="f_CodeExample" style="color: #000080;">{ Тактовая частота процессора (гц) }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> CalcCPUClock;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Вычислить тактовую частоту процессора и записать в переменную CPUClock. }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay(N: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Производит задержку в N микросекунд. Задержки более 4294967296/CPUClock }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ (на 300-м ~ 14) секунд будут работать неправильно из-за переполнения!!! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Перед использованием это процедуры необходимо установить правильное }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ значение переменной CPUClock. Это можно сделать либо вручную, либо }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ выполнив процедуру CalcCPUClock. }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> TDelay(N: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Производит задержку в N тактов процессора }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Implementation</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Uses</span><span class="f_CodeExample" style="color: #000000;"> Dos;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SaveInt08: Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Stage: Byte;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> SpeedCounter; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">far</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ Наш IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,seg @Data</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ds,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc Stage </span><span class="f_CodeExample" style="color: #000080;">{ Прибавляем к Stage единицу }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,20h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 20h,al </span><span class="f_CodeExample" style="color: #000080;">{ Посылаем сигнал "конец IRQ" }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iret </span><span class="f_CodeExample" style="color: #000080;">{ Выходим }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> CalcCPUClock;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,0Dh</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 21h </span><span class="f_CodeExample" style="color: #000080;">{ Сбрасываем кэш }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1681h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Отключаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,0A1h </span><span class="f_CodeExample" style="color: #000080;">{ Маски IRQ 8-15 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,21h </span><span class="f_CodeExample" style="color: #000080;">{ Маски IRQ 0-7 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ax </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем маски }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,0FEh</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 21h,al </span><span class="f_CodeExample" style="color: #000080;">{ Запрещаем IRQ 1-7 (нулевой нам нужен) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 0A1h,al </span><span class="f_CodeExample" style="color: #000080;">{ Запрещаем IRQ 8-15 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,36h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 43h,al </span><span class="f_CodeExample" style="color: #000080;">{ Устанавливаем нормальный режим работы таймера }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> al,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al </span><span class="f_CodeExample" style="color: #000080;">{ 65536 циклов до IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Stage,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000080;">{ Готовимся к началу отсчёта }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetIntVec(</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">, SaveInt08); </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем старый IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetIntVec(</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">, @SpeedCounter); </span><span class="f_CodeExample" style="color: #000080;">{ Устанавливаем свой IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">:cmp Stage,</span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000080;">{ Цикл до первого IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; xchg cx,ax </span><span class="f_CodeExample" style="color: #000080;">{ Запоминаем значение счётчика }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">:cmp Stage,</span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">{ Цикл до второго IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sub ax,cx </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем из текущего значение счётчика запомненное }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h,0B9h; dd 1234DDh </span><span class="f_CodeExample" style="color: #000080;">{ mov ecx,1234DDh }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mul cx </span><span class="f_CodeExample" style="color: #000080;">{ Умножаем значение на 1193181 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h,0Fh,0ACh,0D0h,10h </span><span class="f_CodeExample" style="color: #000080;">{ shrd eax,edx,16 - делим на 65536 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov word ptr CPUClock,ax </span><span class="f_CodeExample" style="color: #000080;">{ Записываем результат в CPUClock }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 21h,al </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем маску IRQ 0-7 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,ah</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 0A1h,al </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем маску IRQ 8-15 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetIntVec(</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">, SaveInt08); </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем старый IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1682h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Включаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> EndEnd;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; push ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; push dx </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем счётчик в стеке }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov ax,word ptr N</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov cx,word ptr CPUClock</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mul cx </span><span class="f_CodeExample" style="color: #000080;">{ Умножаем N на CPUClock }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h,0B9h; dd </span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #000080;">{ mov ecx,1000000 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #000000;"> cx </span><span class="f_CodeExample" style="color: #000080;">{ Затем делим на 1000000 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; xchg si,ax </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем значение в ESI }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; pop cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; pop bx </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем значение счётчика в ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@:db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sub ax,bx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sbb dx,cx </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем из текущего счётчика ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> dx,dx </span><span class="f_CodeExample" style="color: #000080;">{ Старшая часть разницы д.б. всегда 0, проверяем это }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Exit </span><span class="f_CodeExample" style="color: #000080;">{ Нет - выходим! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; cmp ax,si </span><span class="f_CodeExample" style="color: #000080;">{ Проверяем - прошло ли столько, сколько нам надо }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb @ </span><span class="f_CodeExample" style="color: #000080;">{ Нет - ждём ещё }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Exit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> TDelay; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov bx,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov cx,dx </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем счётчик в ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@:db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sub ax,bx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sbb dx,cx </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем из текущего счётчика ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> dx,dx </span><span class="f_CodeExample" style="color: #000080;">{ Старшая часть разницы д.б. всегда 0, проверяем это }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Exit </span><span class="f_CodeExample" style="color: #000080;">{ Нет - выходим! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; cmp ax,word ptr N </span><span class="f_CodeExample" style="color: #000080;">{ Проверяем - прошло ли столько, сколько нам надо }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb @ </span><span class="f_CodeExample" style="color: #000080;">{ Нет - ждём ещё }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Exit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><br /><span style="font-family: 'Times New Roman'; color: #000000;">И</span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">:</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Uses</span><span class="f_CodeExample" style="color: #000000;"> TSCDelay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> N: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CalcCPUClock;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">'Тактовая частота процессора: '</span><span class="f_CodeExample" style="color: #000000;">, CPUClock/</span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">' МГц'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Введите количество микросекунд (не более '</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">4294967296</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">/CPUClock: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' млн): '</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReadLn(N);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Задержка...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MDelay(N);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">' всё!'</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p style="margin: 7px 0px;"> </p> <p>Автор: 7jin</p> <p>Windows is not a real time operating system so it is not really able to reliably achieve high accuracy timing without using a device driver. The best I have been able to get is a few nanoseconds using QueryPerformanceCounter. This is the procedure I use:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WaitCal: Int64;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Wait(ns: Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Counter, Freq, WaitUntil: Int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> QueryPerformanceCounter(Counter) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> QueryPerformanceFrequency(Freq);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WaitUntil := Counter + WaitCal + (ns * (Freq </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> Counter &lt; WaitUntil </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> QueryPerformanceCounter(Counter);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sleep(ns </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><span style="color: #000000;">To get improved accuracy do this a little while before using Wait()</span></p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Start, Finish: Int64;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Sleep(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">QueryPerformanceCounter(Start);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Wait(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">QueryPerformanceCounter(Finish);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WaitCal := Start - Finish;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><span style="color: #000000;">A trick I have found to increase the reliability of this on my computer is to call Wait like this:</span></p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Sleep(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DoSomething;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Wait(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DoSomethingElse;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято из </span><span style="font-family: 'Courier New CYR'; color: #ff0000; font-size: 10pt;">https://www.lmc-mediaagentur</span></p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Unit</span><span class="f_CodeExample" style="color: #000000;"> Counter; (* Written by Jin *)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$O-,F-,S-,N-,R-,Q-}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> tTimerValue = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">record</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Micro: Word; </span><span class="f_CodeExample" style="color: #000080;">{ Счётчик 8253/8254 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Counter: Longint </span><span class="f_CodeExample" style="color: #000080;">{ Счётчик BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MicroFreq = </span><span class="f_CodeExample" style="color: #800000;">1193181</span><span class="f_CodeExample" style="color: #000080;">{ $1234DD }</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ Частота обновления счётчика Micro (1/сек) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CounterFreq = MicroFreq / </span><span class="f_CodeExample" style="color: #800000;">65536</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ Частота обновления счётчика Counter (1/сек) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MicroInterval = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> / MicroFreq; </span><span class="f_CodeExample" style="color: #000080;">{ Интервал обновления счётчика Micro (сек) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CounterInterval = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> / CounterFreq; </span><span class="f_CodeExample" style="color: #000080;">{ Интервал обновления счётчика Counter (сек) }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BIOSCounter: Longint </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #800000;">$0040</span><span class="f_CodeExample" style="color: #000000;">:</span><span class="f_CodeExample" style="color: #800000;">$006C</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Системный счётчик (обновляется CounterFreq раз/сек, }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ то есть каждые CounterInterval секунд) }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> InitTimer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Инициализировать таймер (перевести в нужный режим работы). }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Эту процедуру необходимо выполнять перед использованием функций }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ и процедур для получения значения таймера (или счётчика), если }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Вы в своей программе изменили режим работы таймера. В противном }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ случае эта процедура Вам не понадобится, так как она выполняется }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ в секции инициализации модуля (сразу после запуска программы) ! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Записать значение таймера в переменную Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerSec: Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение таймера в секундах (с точностью до 1 мкс) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение таймера в миллисекундах }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Older, Newer, Result: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Записать разницу значений Newer и Older в переменную Result }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifSec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Older, Newer: tTimerValue): Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить разницу значений Newer и Older в секундах }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifMillisec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Older, Newer: tTimerValue): Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить разницу значений Newer и Older в миллисекундах }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Sec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue): Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить количество секунд по значению переменной Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Millisec(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue): Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить количество миллисекунд по значению переменной Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvSec2Timer(Sec: Real; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Преобразовать значение секунд Sec типа Real в тип tTimerValue }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvMillisec2Timer(Millisec: Longint; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Преобразовать значение миллисекунд Millisec типа Longint в тип tTimerValue }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Сбросить счётчик (то есть принять текущее значение таймера за ноль для }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ процедуры GetCounterValue и функции GetCounterSec) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetCounterValue(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Timer: tTimerValue);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Записать значение счётчика в переменную Timer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterSec: Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение секунд счётчика }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterMillisec: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Получить значение миллисекунд счётчика }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(MS: Word);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Задержка MS миллисекунд (1 сек = 1000 мс) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> DelaySec(Sec: Real);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Задержка Sec секунд }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay(N: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Задержка N * MicroInterval секунд (приближённо N * 0.838095813 мкс). }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Если Вам нужны наиболее точные короткие задержки, лучше использовать }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ эту процедуру, так как она даёт наименьшую погрешность по сравнению }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ с двумя предыдущими процедурами. }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Implementation</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Now: tTimerValue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: tTimerValue;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> InitTimer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,34h </span><span class="f_CodeExample" style="color: #000080;">{ Режим 2 таймера 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 43h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> al,al </span><span class="f_CodeExample" style="color: #000080;">{ 65536 циклов до IRQ }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerValue; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> ax,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov es,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov bx,46Ch </span><span class="f_CodeExample" style="color: #000080;">{ DS:BX = 0000h:046Ch = Таймер BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cli</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov dx,es:[bx]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov cx,es:[bx+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span><span class="f_CodeExample" style="color: #000080;">{ CX:DX = Первое значение таймера BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sti</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 43h,al </span><span class="f_CodeExample" style="color: #000080;">{ Замораживаем таймер 8253/8254 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cli</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov si,es:[bx]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov di,es:[bx+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span><span class="f_CodeExample" style="color: #000080;">{ DI:SI = Второе значение таймера BIOS }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,40h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,40h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sti</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ah,al </span><span class="f_CodeExample" style="color: #000080;">{ AX = Таймер 8253/8254 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> ax </span><span class="f_CodeExample" style="color: #000080;">{ Обратный отсчёт -&gt; Прямой отсчёт }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp dx,si </span><span class="f_CodeExample" style="color: #000080;">{ Первое значение таймера BIOS равно второму значению ? }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> je @Ok </span><span class="f_CodeExample" style="color: #000080;">{ Да! Оставляем как есть (CX:DX), иначе... }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> ax,ax </span><span class="f_CodeExample" style="color: #000080;">{ Таймер BIOS изменился после заморозки таймера 8253/8254 (между OUT и CLI) ? }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> js @Ok </span><span class="f_CodeExample" style="color: #000080;">{ Да! Оставляем как есть (CX:DX), иначе... }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov dx,si</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov cx,di </span><span class="f_CodeExample" style="color: #000080;">{ CX:DX = DI:SI, если таймер BIOS изменился между STI и OUT }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Ok:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> les di,Timer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Low Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,dx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Middle Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ High Word - Записаны из CX:DX:AX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerSec := ConvTimer2Sec(Now)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec := Trunc(GetTimerSec*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lds si,Newer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsw </span><span class="f_CodeExample" style="color: #000080;">{ Low Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg cx,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsw </span><span class="f_CodeExample" style="color: #000080;">{ Middle Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg dx,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsw </span><span class="f_CodeExample" style="color: #000080;">{ High Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg cx,ax </span><span class="f_CodeExample" style="color: #000080;">{ Прочитаны в CX:DX:AX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lds si,Older</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub ax,[si]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sbb dx,[si+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sbb cx,[si+</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем Older из Newer }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> les di,Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Low Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,dx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ Middle Word }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> xchg ax,cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> stosw </span><span class="f_CodeExample" style="color: #000080;">{ High Word - Записано из CX:DX:AX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Older, Newer, Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifSec := ConvTimer2Sec(Now)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetTimerDifMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifMillisec := Trunc(GetTimerDifSec(Older, Newer)*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Sec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Sec := (Timer.Counter*</span><span class="f_CodeExample" style="color: #800000;">65536</span><span class="f_CodeExample" style="color: #000000;"> + Timer.Micro) / MicroFreq</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Millisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ConvTimer2Millisec := Trunc(ConvTimer2Sec(Timer)*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvSec2Timer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Counter := Trunc(Sec * CounterFreq);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Micro := Trunc(Sec * MicroFreq) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">mod</span><span class="f_CodeExample" style="color: #800000;">65536</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ConvMillisec2Timer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Counter := Trunc(Millisec/</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;"> * CounterFreq);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer.Micro := Trunc(Millisec/</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;"> * MicroFreq) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">mod</span><span class="f_CodeExample" style="color: #800000;">65536</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Zero)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> GetCounterValue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Timer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Zero, Timer, Timer)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Zero, Now, Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetCounterSec := ConvTimer2Sec(Now)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> GetCounterMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetCounterMillisec := Trunc(GetCounterSec*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> MS &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Zero := GetTimerMillisec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Until</span><span class="f_CodeExample" style="color: #000000;"> GetTimerMillisec-Zero &gt;= MS</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> DelaySec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: Real;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> Sec &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Zero := GetTimerSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Until</span><span class="f_CodeExample" style="color: #000000;"> GetTimerSec-Zero &gt;= Sec</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Label</span><span class="f_CodeExample" style="color: #000000;"> Check;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> Zero: tTimerValue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> N &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Zero);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Check:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerValue(Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetTimerDifference(Zero, Now, Now);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,word ptr Now</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov dx,word ptr Now+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">{ DX:AX - Прошедшее время }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ mov cx,word ptr Now+4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> or cx,cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> jnz @Exit}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp dx,word ptr N+</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">{ Проверяем старшие слова }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb Check</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ax,word ptr N </span><span class="f_CodeExample" style="color: #000080;">{ Проверяем младшие слова }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb Check</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Exit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> EndEnd;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> InitTimer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p style="margin: 7px 0px;"><br /><span style="font-family: 'Times New Roman'; color: #000000;">И</span><span style="font-family: 'Times New Roman'; color: #000000;">вот</span><span style="font-family: 'Times New Roman'; color: #000000;">ещё</span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">:</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Uses</span><span class="f_CodeExample" style="color: #000000;"> Counter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Ans: Char;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec: Real;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,0Dh</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 21h </span><span class="f_CodeExample" style="color: #000080;">{ Сбрасываем кэш }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1681h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Запрещаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Без задержки...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000 раз холостой цикл...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #000000;"> ;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000 раз по 0 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">'-------------------------------------------------'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1 раз 1 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000 раз по 0.001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'10000 раз по 0.0001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">10000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">0001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'100000 раз по 0.00001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">100000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">00001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'119318 раз по 1/119318.1 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">119318</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MDelay(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">'-------------------------------------------------'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Запускать тесты по микросекундам (м.б. очень долгими) [Y/N] ? : '</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> ah,ah</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 16h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> al,20h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp al,</span><span class="f_CodeExample" style="color: #ff0000;">'y'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> je @Ok</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp al,</span><span class="f_CodeExample" style="color: #ff0000;">'n'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Ok:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Ans,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(Ans);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> Ans = </span><span class="f_CodeExample" style="color: #ff0000;">'y'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1000000 раз по 0.000001 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DelaySec(</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">000001</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'1193181 раз по 1/1193181 сек...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResetCounter;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">1193181</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MDelay(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sec := GetCounterSec;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">#8#8#8': прошло '</span><span class="f_CodeExample" style="color: #000000;">, Sec: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' сек'</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1682h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Разрешаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> EndEnd.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p style="margin: 7px 0px;"><br /><span style="font-family: 'Times New Roman'; color: #000000;">Не</span><span style="font-family: 'Times New Roman'; color: #000000;">забывайте</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">что</span><span style="font-family: 'Times New Roman'; color: #000000;">погрешности</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">которые</span><span style="font-family: 'Times New Roman'; color: #000000;">будет</span><span style="font-family: 'Times New Roman'; color: #000000;">выдавать</span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">будут</span><span style="font-family: 'Times New Roman'; color: #000000;">из</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">за</span><span style="font-family: 'Times New Roman'; color: #000000;">того</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">что</span><span style="font-family: 'Times New Roman'; color: #000000;">какое</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">то</span><span style="font-family: 'Times New Roman'; color: #000000;">время</span><span style="font-family: 'Times New Roman'; color: #000000;">тратиться</span><span style="font-family: 'Times New Roman'; color: #000000;">на</span><span style="font-family: 'Times New Roman'; color: #000000;">вызов</span><span style="font-family: 'Times New Roman'; color: #000000;">процедуры</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">циклы</span><span style="font-family: 'Times New Roman'; color: #000000;">и</span><span style="font-family: 'Times New Roman'; color: #000000;">т</span><span style="font-family: 'Times New Roman'; color: #000000;">.</span><span style="font-family: 'Times New Roman'; color: #000000;">д</span><span style="font-family: 'Times New Roman'; color: #000000;">. (</span><span style="font-family: 'Times New Roman'; color: #000000;">т</span><span style="font-family: 'Times New Roman'; color: #000000;">.</span><span style="font-family: 'Times New Roman'; color: #000000;">к</span><span style="font-family: 'Times New Roman'; color: #000000;">. </span><span style="font-family: 'Times New Roman'; color: #000000;">там</span><span style="font-family: 'Times New Roman'; color: #000000;">используются</span><span style="font-family: 'Times New Roman'; color: #000000;">процедуры</span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">DelaySec</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">MDelay</span><span style="font-family: 'Times New Roman'; color: #000000;">).... </span><span style="font-family: 'Times New Roman'; color: #000000;">Но</span><span style="font-family: 'Times New Roman'; color: #000000;">если</span><span style="font-family: 'Times New Roman'; color: #000000;">вызвать</span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">ResetCounter</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">а</span><span style="font-family: 'Times New Roman'; color: #000000;">через</span><span style="font-family: 'Times New Roman'; color: #000000;">некоторое</span><span style="font-family: 'Times New Roman'; color: #000000;">время</span><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">GetCounterSec</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">то</span><span style="font-family: 'Times New Roman'; color: #000000;">результат</span><span style="font-family: 'Times New Roman'; color: #000000;">будет</span><span style="font-family: 'Times New Roman'; color: #000000;">точным</span><span style="font-family: 'Times New Roman'; color: #000000;"> (</span><span style="font-family: 'Times New Roman'; color: #000000;">собственно</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">именно</span><span style="font-family: 'Times New Roman'; color: #000000;">так</span><span style="font-family: 'Times New Roman'; color: #000000;">здесь</span><span style="font-family: 'Times New Roman'; color: #000000;">и</span><span style="font-family: 'Times New Roman'; color: #000000;">измеряются</span><span style="font-family: 'Times New Roman'; color: #000000;">погрешности</span><span style="font-family: 'Times New Roman'; color: #000000;">)! </span><span style="font-family: 'Times New Roman'; color: #000000;">И</span><span style="font-family: 'Times New Roman'; color: #000000;">можно</span><span style="font-family: 'Times New Roman'; color: #000000;">вызывать</span><span style="font-family: 'Times New Roman'; color: #000000;">его</span><span style="font-family: 'Times New Roman'; color: #000000;"> (GetCounterSec) </span><span style="font-family: 'Times New Roman'; color: #000000;">ещё</span><span style="font-family: 'Times New Roman'; color: #000000;">хоть</span><span style="font-family: 'Times New Roman'; color: #000000;"> 10000 </span><span style="font-family: 'Times New Roman'; color: #000000;">раз</span><span style="font-family: 'Times New Roman'; color: #000000;">! ;D</span><br /><span style="font-family: 'Times New Roman'; color: #000000;">Кстати</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">запускайте</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">только</span><span style="font-family: 'Times New Roman'; color: #000000;">в</span><span style="font-family: 'Times New Roman'; color: #000000;">полноэкранном</span><span style="font-family: 'Times New Roman'; color: #000000;">режиме</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">т</span><span style="font-family: 'Times New Roman'; color: #000000;">.</span><span style="font-family: 'Times New Roman'; color: #000000;">к</span><span style="font-family: 'Times New Roman'; color: #000000;">. </span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">отключает</span><span style="font-family: 'Times New Roman'; color: #000000;">многозадачность</span><span style="font-family: 'Times New Roman'; color: #000000;"> Windows, </span><span style="font-family: 'Times New Roman'; color: #000000;">и</span><span style="font-family: 'Times New Roman'; color: #000000;">на</span><span style="font-family: 'Times New Roman'; color: #000000;">экране</span><span style="font-family: 'Times New Roman'; color: #000000;">вы</span><span style="font-family: 'Times New Roman'; color: #000000;">ничего</span><span style="font-family: 'Times New Roman'; color: #000000;">не</span><span style="font-family: 'Times New Roman'; color: #000000;">увидите</span><span style="font-family: 'Times New Roman'; color: #000000;"> (</span><span style="font-family: 'Times New Roman'; color: #000000;">будет</span><span style="font-family: 'Times New Roman'; color: #000000;">впечатление</span><span style="font-family: 'Times New Roman'; color: #000000;">, </span><span style="font-family: 'Times New Roman'; color: #000000;">что</span><span style="font-family: 'Times New Roman'; color: #000000;">прога</span><span style="font-family: 'Times New Roman'; color: #000000;">повисла</span><span style="font-family: 'Times New Roman'; color: #000000;">). </span></p> <p style="margin: 7px 0px;"> </p> <p>Автор: 7jin</p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято из </span><span style="color: #0000ff; font-size: 10pt; font-weight: bold; text-decoration: underline;">https://forum.sources</span></p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <p style="margin: 7px 0px;"><span style="font-family: 'Times New Roman'; color: #000000;">А</span><span style="font-family: 'Times New Roman'; color: #000000;">вот</span><span style="font-family: 'Times New Roman'; color: #000000;">ещё</span><span style="font-family: 'Times New Roman'; color: #000000;">один</span><span style="font-family: 'Times New Roman'; color: #000000;">способ</span><span style="font-family: 'Times New Roman'; color: #000000;"> (</span><span style="font-family: 'Times New Roman'; color: #000000;">работает</span><span style="font-family: 'Times New Roman'; color: #000000;">только</span><span style="font-family: 'Times New Roman'; color: #000000;">на</span><span style="font-family: 'Times New Roman'; color: #000000;"> Pentium </span><span style="font-family: 'Times New Roman'; color: #000000;">или</span><span style="font-family: 'Times New Roman'; color: #000000;">выше</span><span style="font-family: 'Times New Roman'; color: #000000;">)....</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Unit</span><span class="f_CodeExample" style="color: #000000;"> TSCDelay; (* Работает только на Pentium (и то не всегда ;) *)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$O-,F-,G+,S-,R-}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CPUClock: Longint; </span><span class="f_CodeExample" style="color: #000080;">{ Тактовая частота процессора (гц) }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> CalcCPUClock;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Вычислить тактовую частоту процессора и записать в переменную CPUClock. }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay(N: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Производит задержку в N микросекунд. Задержки более 4294967296/CPUClock }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ (на 300-м ~ 14) секунд будут работать неправильно из-за переполнения!!! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Перед использованием это процедуры необходимо установить правильное }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ значение переменной CPUClock. Это можно сделать либо вручную, либо }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ выполнив процедуру CalcCPUClock. }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> TDelay(N: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Производит задержку в N тактов процессора }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Implementation</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Uses</span><span class="f_CodeExample" style="color: #000000;"> Dos;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SaveInt08: Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Stage: Byte;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> SpeedCounter; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">far</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ Наш IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,seg @Data</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ds,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc Stage </span><span class="f_CodeExample" style="color: #000080;">{ Прибавляем к Stage единицу }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,20h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 20h,al </span><span class="f_CodeExample" style="color: #000080;">{ Посылаем сигнал "конец IRQ" }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ds</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iret </span><span class="f_CodeExample" style="color: #000080;">{ Выходим }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> CalcCPUClock;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,0Dh</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 21h </span><span class="f_CodeExample" style="color: #000080;">{ Сбрасываем кэш }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1681h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Отключаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,0A1h </span><span class="f_CodeExample" style="color: #000080;">{ Маски IRQ 8-15 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ah,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> al,21h </span><span class="f_CodeExample" style="color: #000080;">{ Маски IRQ 0-7 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ax </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем маски }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,0FEh</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 21h,al </span><span class="f_CodeExample" style="color: #000080;">{ Запрещаем IRQ 1-7 (нулевой нам нужен) }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 0A1h,al </span><span class="f_CodeExample" style="color: #000080;">{ Запрещаем IRQ 8-15 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,36h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 43h,al </span><span class="f_CodeExample" style="color: #000080;">{ Устанавливаем нормальный режим работы таймера }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> al,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 40h,al </span><span class="f_CodeExample" style="color: #000080;">{ 65536 циклов до IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Stage,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000080;">{ Готовимся к началу отсчёта }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetIntVec(</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">, SaveInt08); </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем старый IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetIntVec(</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">, @SpeedCounter); </span><span class="f_CodeExample" style="color: #000080;">{ Устанавливаем свой IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">:cmp Stage,</span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000080;">{ Цикл до первого IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; xchg cx,ax </span><span class="f_CodeExample" style="color: #000080;">{ Запоминаем значение счётчика }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">:cmp Stage,</span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">{ Цикл до второго IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sub ax,cx </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем из текущего значение счётчика запомненное }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h,0B9h; dd 1234DDh </span><span class="f_CodeExample" style="color: #000080;">{ mov ecx,1234DDh }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mul cx </span><span class="f_CodeExample" style="color: #000080;">{ Умножаем значение на 1193181 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h,0Fh,0ACh,0D0h,10h </span><span class="f_CodeExample" style="color: #000080;">{ shrd eax,edx,16 - делим на 65536 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov word ptr CPUClock,ax </span><span class="f_CodeExample" style="color: #000080;">{ Записываем результат в CPUClock }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 21h,al </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем маску IRQ 0-7 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al,ah</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">out</span><span class="f_CodeExample" style="color: #000000;"> 0A1h,al </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем маску IRQ 8-15 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetIntVec(</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">, SaveInt08); </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем старый IRQ 0 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ax,1682h</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> int 2Fh </span><span class="f_CodeExample" style="color: #000080;">{ Включаем Windows Task Switch }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> EndEnd;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> MDelay; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; push ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; push dx </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем счётчик в стеке }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov ax,word ptr N</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov cx,word ptr CPUClock</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mul cx </span><span class="f_CodeExample" style="color: #000080;">{ Умножаем N на CPUClock }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h,0B9h; dd </span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #000080;">{ mov ecx,1000000 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #000000;"> cx </span><span class="f_CodeExample" style="color: #000080;">{ Затем делим на 1000000 }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; xchg si,ax </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем значение в ESI }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; pop cx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; pop bx </span><span class="f_CodeExample" style="color: #000080;">{ Восстанавливаем значение счётчика в ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@:db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sub ax,bx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sbb dx,cx </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем из текущего счётчика ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> dx,dx </span><span class="f_CodeExample" style="color: #000080;">{ Старшая часть разницы д.б. всегда 0, проверяем это }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Exit </span><span class="f_CodeExample" style="color: #000080;">{ Нет - выходим! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; cmp ax,si </span><span class="f_CodeExample" style="color: #000080;">{ Проверяем - прошло ли столько, сколько нам надо }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb @ </span><span class="f_CodeExample" style="color: #000080;">{ Нет - ждём ещё }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Exit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> TDelay; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">assembler</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov bx,ax</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; mov cx,dx </span><span class="f_CodeExample" style="color: #000080;">{ Сохраняем счётчик в ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@:db 0Fh,31h </span><span class="f_CodeExample" style="color: #000080;">{ RDTSC }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sub ax,bx</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; sbb dx,cx </span><span class="f_CodeExample" style="color: #000080;">{ Вычитаем из текущего счётчика ECX:EBX }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> dx,dx </span><span class="f_CodeExample" style="color: #000080;">{ Старшая часть разницы д.б. всегда 0, проверяем это }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Exit </span><span class="f_CodeExample" style="color: #000080;">{ Нет - выходим! }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> db 66h; cmp ax,word ptr N </span><span class="f_CodeExample" style="color: #000080;">{ Проверяем - прошло ли столько, сколько нам надо }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jb @ </span><span class="f_CodeExample" style="color: #000080;">{ Нет - ждём ещё }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Exit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p><br /><span style="font-family: 'Times New Roman'; color: #000000;">И</span><span style="font-family: 'Times New Roman'; color: #000000;">программа</span><span style="font-family: 'Times New Roman'; color: #000000;">-</span><span style="font-family: 'Times New Roman'; color: #000000;">тестер</span><span style="font-family: 'Times New Roman'; color: #000000;">:</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Uses</span><span class="f_CodeExample" style="color: #000000;"> TSCDelay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Var</span><span class="f_CodeExample" style="color: #000000;"> N: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CalcCPUClock;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">'Тактовая частота процессора: '</span><span class="f_CodeExample" style="color: #000000;">, CPUClock/</span><span class="f_CodeExample" style="color: #800000;">1000000</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">' МГц'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Введите количество микросекунд (не более '</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">4294967296</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">/CPUClock: </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' млн): '</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReadLn(N);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Задержка...'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MDelay(N);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WriteLn(</span><span class="f_CodeExample" style="color: #ff0000;">' всё!'</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">End</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p style="margin: 7px 0px;"> </p> <p>Автор: 7jin</p> Класс-оболочка для объекта синхронизации WaitableTimer 2013-09-16T14:29:00+07:00 2013-09-16T14:29:00+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/klass-obolochka-dlya-ob-ekta-sinkhronizatsii-waitabletimer.html Super User toto44@inbox.ru <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ **** UBPFD *********** by kladovka ****</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">&gt;&gt; Класс-оболочка для объекта синхронизации WaitableTimer.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Класс представляет собой оболочку для объекта синхронизации WaitableTimer,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">существующего в операционных системах, основанных на ядре WinNT. </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Методы.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">--------------</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Start - запуск таймера.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Stop - остановка таймера.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Wait - ожидает срабатывания таймера заданное количество миллисекунд и</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">возвращает результат ожидания.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Свойства.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">--------------</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Time : TDateTime - дата/время когда должен сработать таймер.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Period : integer - Период срабатывания таймера. Если значение равно 0, то</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">таймер срабатывает один раз, если же значение отлично от нуля, таймер будет</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">срабатывать периодически с заданным интервалом, первое срабытывание произойдет</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">в момент, заданный свойством Time. </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LongTime : int64 - альтернативный способ задания времени срабатывания. Время</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">задается в формате UTC.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Handle : THandle (только чтение) - хендл обекта синхронизации.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LastError : integer (только чтение) - В случае если метод Wait возвращает</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">wrError, это свойство содержит значение, возвращаемое функцией GetLastError.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Зависимости: Windows, SysUtils, SyncObjs</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Автор: vuk</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Copyright: Алексей Вуколов</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">********************************************** }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> wtimer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Windows, SysUtils, SyncObjs;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">( TSynchroObject )</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">protected</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FHandle : THandle;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FPeriod : longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FDueTime : TDateTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FLastError: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FLongTime: int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">public</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> Create( ManualReset : boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TimerAttributes: PSecurityAttributes; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;"> : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;"> );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> Destroy; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">override</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Start;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Stop;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Wait( Timeout : longint ) : TWaitResult;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> Handle : THandle </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FHandle;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> LastError : integer </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FLastError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> Period : integer </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FPeriod </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">write</span><span class="f_CodeExample" style="color: #000000;"> FPeriod;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> Time : TDateTime </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FDueTime </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">write</span><span class="f_CodeExample" style="color: #000000;"> FDueTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> LongTime : int64 </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FLongTime </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">write</span><span class="f_CodeExample" style="color: #000000;"> FLongTime;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ TWaitableTimer }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Create(ManualReset: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TimerAttributes: PSecurityAttributes; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pName : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">inherited</span><span class="f_CodeExample" style="color: #000000;"> Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> pName := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pName := PChar( </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;"> );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FHandle := CreateWaitableTimer( TimerAttributes, ManualReset, pName );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Destroy;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CloseHandle(FHandle);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">inherited</span><span class="f_CodeExample" style="color: #000000;"> Destroy;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Start;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SysTime : TSystemTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LocalTime, UTCTime : FileTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value : int64 </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> UTCTime;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FLongTime = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DateTimeToSystemTime( FDueTime, SysTime );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SystemTimeToFileTime( SysTime, LocalTime );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LocalFileTimeToFileTime( LocalTime, UTCTime );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value := FLongTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetWaitableTimer( FHandle, Value, FPeriod, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, false );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Stop;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CancelWaitableTimer( FHandle );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Wait(Timeout: Integer): TWaitResult;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> WaitForSingleObjectEx(Handle, Timeout, BOOL(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_ABANDONED: Result := wrAbandoned;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">OBJECT</span><span class="f_CodeExample" style="color: #000000;">_</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: Result := wrSignaled;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_TIMEOUT: Result := wrTimeout;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_FAILED:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := wrError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FLastError := GetLastError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := wrError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">. </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p>Пример использования:</p> <p>Пример создания таймера, который срабатывает по алгоритму "завтра в это же</p> <p>время и далее с интервалом в одну минуту".</p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer : TWaitableTimer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">....</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer := TWaitableTimer.Create(false, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer.Time := Now + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">//завтра в это же время</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer.Period := </span><span class="f_CodeExample" style="color: #800000;">60</span><span class="f_CodeExample" style="color: #000000;"> * </span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">//Интервал в 1 минуту</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer.Start; </span><span class="f_CodeExample" style="color: #000080;">//запуск таймера</span></p> <p>....</p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ **** UBPFD *********** by kladovka ****</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">&gt;&gt; Класс-оболочка для объекта синхронизации WaitableTimer.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Класс представляет собой оболочку для объекта синхронизации WaitableTimer,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">существующего в операционных системах, основанных на ядре WinNT. </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Методы.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">--------------</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Start - запуск таймера.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Stop - остановка таймера.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Wait - ожидает срабатывания таймера заданное количество миллисекунд и</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">возвращает результат ожидания.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Свойства.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">--------------</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Time : TDateTime - дата/время когда должен сработать таймер.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Period : integer - Период срабатывания таймера. Если значение равно 0, то</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">таймер срабатывает один раз, если же значение отлично от нуля, таймер будет</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">срабатывать периодически с заданным интервалом, первое срабытывание произойдет</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">в момент, заданный свойством Time. </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LongTime : int64 - альтернативный способ задания времени срабатывания. Время</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">задается в формате UTC.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Handle : THandle (только чтение) - хендл обекта синхронизации.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LastError : integer (только чтение) - В случае если метод Wait возвращает</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">wrError, это свойство содержит значение, возвращаемое функцией GetLastError.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Зависимости: Windows, SysUtils, SyncObjs</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Автор: vuk</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Copyright: Алексей Вуколов</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">********************************************** }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> wtimer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Windows, SysUtils, SyncObjs;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">( TSynchroObject )</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">protected</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FHandle : THandle;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FPeriod : longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FDueTime : TDateTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FLastError: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FLongTime: int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">public</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> Create( ManualReset : boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TimerAttributes: PSecurityAttributes; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;"> : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;"> );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> Destroy; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">override</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Start;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Stop;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Wait( Timeout : longint ) : TWaitResult;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> Handle : THandle </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FHandle;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> LastError : integer </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FLastError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> Period : integer </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FPeriod </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">write</span><span class="f_CodeExample" style="color: #000000;"> FPeriod;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> Time : TDateTime </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FDueTime </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">write</span><span class="f_CodeExample" style="color: #000000;"> FDueTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">property</span><span class="f_CodeExample" style="color: #000000;"> LongTime : int64 </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">read</span><span class="f_CodeExample" style="color: #000000;"> FLongTime </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">write</span><span class="f_CodeExample" style="color: #000000;"> FLongTime;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ TWaitableTimer }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Create(ManualReset: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TimerAttributes: PSecurityAttributes; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pName : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">inherited</span><span class="f_CodeExample" style="color: #000000;"> Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> pName := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pName := PChar( </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;"> );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FHandle := CreateWaitableTimer( TimerAttributes, ManualReset, pName );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Destroy;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CloseHandle(FHandle);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">inherited</span><span class="f_CodeExample" style="color: #000000;"> Destroy;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Start;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SysTime : TSystemTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LocalTime, UTCTime : FileTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value : int64 </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> UTCTime;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FLongTime = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DateTimeToSystemTime( FDueTime, SysTime );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SystemTimeToFileTime( SysTime, LocalTime );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LocalFileTimeToFileTime( LocalTime, UTCTime );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value := FLongTime;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetWaitableTimer( FHandle, Value, FPeriod, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, false );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Stop;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CancelWaitableTimer( FHandle );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> TWaitableTimer.Wait(Timeout: Integer): TWaitResult;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> WaitForSingleObjectEx(Handle, Timeout, BOOL(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_ABANDONED: Result := wrAbandoned;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">OBJECT</span><span class="f_CodeExample" style="color: #000000;">_</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">: Result := wrSignaled;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_TIMEOUT: Result := wrTimeout;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WAIT_FAILED:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := wrError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FLastError := GetLastError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := wrError;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">. </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p>Пример использования:</p> <p>Пример создания таймера, который срабатывает по алгоритму "завтра в это же</p> <p>время и далее с интервалом в одну минуту".</p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer : TWaitableTimer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">....</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer := TWaitableTimer.Create(false, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer.Time := Now + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">//завтра в это же время</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer.Period := </span><span class="f_CodeExample" style="color: #800000;">60</span><span class="f_CodeExample" style="color: #000000;"> * </span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">//Интервал в 1 минуту</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Timer.Start; </span><span class="f_CodeExample" style="color: #000080;">//запуск таймера</span></p> <p>....</p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> О таймере 2013-09-16T14:36:53+07:00 2013-09-16T14:36:53+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/o-tajmere.html Super User toto44@inbox.ru <p>Компонент timer (таймер) служит для отсчета интервалов реального времени. Его свойство interval определяет интервал временив миллисекундах , который должен пройти от включения таймера до наступления события ontimer. Таймер включается при установке значения true в его свойство enabled. Единожды включенный таймер все время будет возбуждать события ontimer до тех пор, пока его свойство enabled не примет значения false.</p> <p>Следует учесть, что в силу специфики реализации стандартного аппаратного таймера ibm-совместимого компьютера минимальный реально достижимый интервал отсчета времени не может быть меньше 55 мс (этот интервал называется тиком), более того, любой интервал времени, отсчитываемый с помощью таймера, всегда кратен 55 мс. Чтобы убедиться в этом, проведите эксперимент, в котором подсчитывается среднее время между двумя срабатываниями таймера (timer.dpr):</p> <p>Начните новый проект с пустой формой и положите на нее компонент ttimer. <br />Установите в свойство enabled таймера значение false. <br />Напишите такой модуль главной формы (листинг 4): <br />Листинг 4</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> unit1; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">windows, messages, sysutils, classes, graphics, controls, forms, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">dialogs, stdctrls, buttons, extctrls; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">tfmexample = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">(tform) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">panel1: tpanel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbrun: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbclose: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput: tedit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lboutput: tlabel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mmoutput: tmemo; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timer1: ttimer; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> timer1timer(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">private</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime: tdatetime; </span><span class="f_CodeExample" style="color: #000080;">// Начальное время цикла </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter: integer; </span><span class="f_CodeExample" style="color: #000080;">// Счетчик цикла </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> fmexample: tfmexample; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$r *.dfm}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Запускает таймер. edinput содержит период его срабатывания. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> delay: word; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Проверяем задание интервала </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> edinput.text=</span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delay := strtoint(edinput.text); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> showmessage(</span><span class="f_CodeExample" style="color: #ff0000;">'Ошибка в записи числа'</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.selectall; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.setfocus; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Сбрасываем счетчик </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timer1.interval := delay; </span><span class="f_CodeExample" style="color: #000080;">// Устанавливаем интервал </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime := time; </span><span class="f_CodeExample" style="color: #000080;">// Засекаем время </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timer1.enabled := true; </span><span class="f_CodeExample" style="color: #000080;">// Пускаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">screen.cursor := crhourglass </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.timer1timer(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> h, m, s, ms: word; </span><span class="f_CodeExample" style="color: #000080;">// Переменные для декодирования времени </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> maxcount = </span><span class="f_CodeExample" style="color: #800000;">55</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Количество срабатываний таймера </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := counter + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Наращиваем счетчик срабатываний </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> counter=maxcount </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000080;">// Конец цикла? </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span><span class="f_CodeExample" style="color: #000080;">// - Да </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> timer1.enabled := false; </span><span class="f_CodeExample" style="color: #000080;">// Останавливаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> // Находим среднее время срабатывания: </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> decodetime((time-begtime)/maxcount, h, m, s, ms); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mmoutput.lines.add( </span><span class="f_CodeExample" style="color: #000080;">// Выводим результат </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> format(</span><span class="f_CodeExample" style="color: #ff0000;">'Задано %s ms. Получено %d ms.'</span><span class="f_CodeExample" style="color: #000000;">, [edinput.text, ms])); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.text := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Готовим следующий запуск </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.setfocus; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> screen.cursor := crdefault </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput.setfocus </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">. </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p>Необходимость нескольких (maxcount) срабатываний для точного усреднения результата связана с тем, что системные часы обновляются каждые 55 мс. После запуска программы и ввода 1 как требуемого периода срабатывания в редакторе mmoutput вы увидите строку</p> <p> Задано 1 ms. Получено 55 ms.</p> <p> в которой указывается, какое реальное время разделяет два соседних события ontimer. Если вы установите период таймера в диапазоне от 56 до 110 мс, в строке будет указано 110 ms и т.д. (в силу дискретности обновления системных часов результаты могут несколько отличаться в ту или иную сторону).</p> <p> </p> <p>В ряде практически важных областей применения (при разработке игр, в системах реального времени для управления внешними устройствам и т.п.) интервал 55 мс может оказаться слишком велик. Современный ПК имеет мультимедийный таймер, период срабатывания которого может быть от 1 мс и выше, однако этот таймер не имеет компонентного воплощения, поэтому для доступа к нему приходится использовать функции api.</p> <p> </p> <p>Общая схема его использования такова. Сначала готовится процедура обратного вызова (call back) с заголовком:</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> timeproc(uid, umsg: uint; dwuser, dw1, dw2: dword); </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p><br />Здесь uid — идентификатор события таймера (см. об этом ниже); umsg — не используется; dwuser — произвольное число, передаваемое процедуре в момент срабатывания таймера; dw1, dw2 — не используются.</p> <p>Запуск таймера реализуется функцией:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timesetevent(udelay, uresolution: uint; lptimeproc: pointer; dwuser: dword; fuevent: uint): uint; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm.dll'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p><br />Здесь udelay — необходимый период срабатывания таймера (в мс); uresolution — разрешение таймера (значение 0 означает, что события срабатывания таймера будут возникать с максимально возможной частотой; в целях снижения нагрузки на систему вы можете увеличить это значение); lptimeproc — адрес процедуры обратного вызова; dwuser — произвольное число, которое передается процедуре обратного вызова и которым программист может распоряжаться по своему усмотрению; fuevent — параметр, управляющий периодичностью возникновения события таймера: time_oneshot (0) — событие возникает только один раз через udelay миллисекунд; time_periodic (1) — события возникают периодически каждые udelay мс. При успешном обращении функция возвращает идентификатор события таймера и 0, если обращение было ошибочным.</p> <p> </p> <p>Таймер останавливается, и связанные с ним системные ресурсы освобождаются функцией:</p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timekillevent(uid: uint): uint; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm.dll'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p>Здесь uid — идентификатор события таймера, полученный с помощью timesetevent.</p> <p>В следующем примере (timer.dpr) иллюстрируется использование мультимедийного таймера (листинг 5).</p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> unit1; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">windows, messages, sysutils, classes, graphics, controls, forms, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">dialogs, stdctrls, buttons, extctrls; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">tfmexample = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">(tform) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">panel1: tpanel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbrun: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbclose: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput: tedit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lboutput: tlabel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mmoutput: tmemo; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> fmexample: tfmexample; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$r *.dfm}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Объявление экспортируемых функций: </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timesetevent(udelay, ureolution: uint; lptimeproc: pointer; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">dwuser: dword; fuevent: uint): integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timekillevent(uid: uint): integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Объявление глобальных переменных </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ueventid: uint; </span><span class="f_CodeExample" style="color: #000080;">// Идентификатор события таймера </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime: tdatetime; </span><span class="f_CodeExample" style="color: #000080;">// Засекаем время&lt; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter: integer; </span><span class="f_CodeExample" style="color: #000080;">// Счетчик повторений </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">delay: word; </span><span class="f_CodeExample" style="color: #000080;">// Период срабатывания </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> proctime(uid, msg: uint; dwuse, dw1, dw2: dword); </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Реакция на срабатывание таймера (процедура обратного вызова) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> h, m, s, ms: word; </span><span class="f_CodeExample" style="color: #000080;">// Переменные для декодирования времени </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> maxcount = </span><span class="f_CodeExample" style="color: #800000;">55</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Количество повторений </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timekillevent(ueventid); </span><span class="f_CodeExample" style="color: #000080;">// Останавливаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := counter+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Наращиваем счетчик </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> counter=maxcount </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000080;">// Конец цикла? </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span><span class="f_CodeExample" style="color: #000080;">// - Да: декодируем время </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> decodetime((time-begtime)/maxcount, h, m, s, ms); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmexample.mmoutput.lines.add( </span><span class="f_CodeExample" style="color: #000080;">// Сообщаем результат </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> format(</span><span class="f_CodeExample" style="color: #ff0000;">'Задано %s ms. Получено %d ms'</span><span class="f_CodeExample" style="color: #000000;">, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> [fmexample.edinput.text,ms])); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmexample.edinput.text := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Готовим повторение </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmexample.edinput.setfocus </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #000080;">// - Нет: вновь пускаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ueventid := timesetevent(delay,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,@proctime,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Запускает таймер. edinput содержит требуемый период. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Проверяем задание периода </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> edinput.text=</span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delay := strtoint(edinput.text) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> showmessage(</span><span class="f_CodeExample" style="color: #ff0000;">'Ошибка ввода числа'</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.selectall; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.setfocus; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Сбрасываем счетчик </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime := time; </span><span class="f_CodeExample" style="color: #000080;">// Засекаем время </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Запускаем таймер: </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ueventid := timesetevent(delay,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,@proctime,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ueventid=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> showmessage(</span><span class="f_CodeExample" style="color: #ff0000;">'Ошибка запуска таймера'</span><span class="f_CodeExample" style="color: #000000;">) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput.setfocus </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">. </span></p> </td> </tr> </tbody> </table> </div> <p><br /><span style="font-family: 'Times New Roman'; color: #000000;">Источник</span><span style="font-family: 'Times New Roman'; color: #000000;">: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.delphi.h5</span></p> <p>Компонент timer (таймер) служит для отсчета интервалов реального времени. Его свойство interval определяет интервал временив миллисекундах , который должен пройти от включения таймера до наступления события ontimer. Таймер включается при установке значения true в его свойство enabled. Единожды включенный таймер все время будет возбуждать события ontimer до тех пор, пока его свойство enabled не примет значения false.</p> <p>Следует учесть, что в силу специфики реализации стандартного аппаратного таймера ibm-совместимого компьютера минимальный реально достижимый интервал отсчета времени не может быть меньше 55 мс (этот интервал называется тиком), более того, любой интервал времени, отсчитываемый с помощью таймера, всегда кратен 55 мс. Чтобы убедиться в этом, проведите эксперимент, в котором подсчитывается среднее время между двумя срабатываниями таймера (timer.dpr):</p> <p>Начните новый проект с пустой формой и положите на нее компонент ttimer. <br />Установите в свойство enabled таймера значение false. <br />Напишите такой модуль главной формы (листинг 4): <br />Листинг 4</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> unit1; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">windows, messages, sysutils, classes, graphics, controls, forms, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">dialogs, stdctrls, buttons, extctrls; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">tfmexample = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">(tform) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">panel1: tpanel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbrun: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbclose: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput: tedit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lboutput: tlabel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mmoutput: tmemo; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timer1: ttimer; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> timer1timer(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">private</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime: tdatetime; </span><span class="f_CodeExample" style="color: #000080;">// Начальное время цикла </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter: integer; </span><span class="f_CodeExample" style="color: #000080;">// Счетчик цикла </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> fmexample: tfmexample; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$r *.dfm}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Запускает таймер. edinput содержит период его срабатывания. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> delay: word; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Проверяем задание интервала </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> edinput.text=</span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delay := strtoint(edinput.text); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> showmessage(</span><span class="f_CodeExample" style="color: #ff0000;">'Ошибка в записи числа'</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.selectall; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.setfocus; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Сбрасываем счетчик </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timer1.interval := delay; </span><span class="f_CodeExample" style="color: #000080;">// Устанавливаем интервал </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime := time; </span><span class="f_CodeExample" style="color: #000080;">// Засекаем время </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timer1.enabled := true; </span><span class="f_CodeExample" style="color: #000080;">// Пускаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">screen.cursor := crhourglass </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.timer1timer(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> h, m, s, ms: word; </span><span class="f_CodeExample" style="color: #000080;">// Переменные для декодирования времени </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> maxcount = </span><span class="f_CodeExample" style="color: #800000;">55</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Количество срабатываний таймера </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := counter + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Наращиваем счетчик срабатываний </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> counter=maxcount </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000080;">// Конец цикла? </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span><span class="f_CodeExample" style="color: #000080;">// - Да </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> timer1.enabled := false; </span><span class="f_CodeExample" style="color: #000080;">// Останавливаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> // Находим среднее время срабатывания: </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> decodetime((time-begtime)/maxcount, h, m, s, ms); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mmoutput.lines.add( </span><span class="f_CodeExample" style="color: #000080;">// Выводим результат </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> format(</span><span class="f_CodeExample" style="color: #ff0000;">'Задано %s ms. Получено %d ms.'</span><span class="f_CodeExample" style="color: #000000;">, [edinput.text, ms])); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.text := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Готовим следующий запуск </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.setfocus; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> screen.cursor := crdefault </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput.setfocus </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">. </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p>Необходимость нескольких (maxcount) срабатываний для точного усреднения результата связана с тем, что системные часы обновляются каждые 55 мс. После запуска программы и ввода 1 как требуемого периода срабатывания в редакторе mmoutput вы увидите строку</p> <p> Задано 1 ms. Получено 55 ms.</p> <p> в которой указывается, какое реальное время разделяет два соседних события ontimer. Если вы установите период таймера в диапазоне от 56 до 110 мс, в строке будет указано 110 ms и т.д. (в силу дискретности обновления системных часов результаты могут несколько отличаться в ту или иную сторону).</p> <p> </p> <p>В ряде практически важных областей применения (при разработке игр, в системах реального времени для управления внешними устройствам и т.п.) интервал 55 мс может оказаться слишком велик. Современный ПК имеет мультимедийный таймер, период срабатывания которого может быть от 1 мс и выше, однако этот таймер не имеет компонентного воплощения, поэтому для доступа к нему приходится использовать функции api.</p> <p> </p> <p>Общая схема его использования такова. Сначала готовится процедура обратного вызова (call back) с заголовком:</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> timeproc(uid, umsg: uint; dwuser, dw1, dw2: dword); </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p><br />Здесь uid — идентификатор события таймера (см. об этом ниже); umsg — не используется; dwuser — произвольное число, передаваемое процедуре в момент срабатывания таймера; dw1, dw2 — не используются.</p> <p>Запуск таймера реализуется функцией:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timesetevent(udelay, uresolution: uint; lptimeproc: pointer; dwuser: dword; fuevent: uint): uint; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm.dll'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p><br />Здесь udelay — необходимый период срабатывания таймера (в мс); uresolution — разрешение таймера (значение 0 означает, что события срабатывания таймера будут возникать с максимально возможной частотой; в целях снижения нагрузки на систему вы можете увеличить это значение); lptimeproc — адрес процедуры обратного вызова; dwuser — произвольное число, которое передается процедуре обратного вызова и которым программист может распоряжаться по своему усмотрению; fuevent — параметр, управляющий периодичностью возникновения события таймера: time_oneshot (0) — событие возникает только один раз через udelay миллисекунд; time_periodic (1) — события возникают периодически каждые udelay мс. При успешном обращении функция возвращает идентификатор события таймера и 0, если обращение было ошибочным.</p> <p> </p> <p>Таймер останавливается, и связанные с ним системные ресурсы освобождаются функцией:</p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timekillevent(uid: uint): uint; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm.dll'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p>Здесь uid — идентификатор события таймера, полученный с помощью timesetevent.</p> <p>В следующем примере (timer.dpr) иллюстрируется использование мультимедийного таймера (листинг 5).</p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> unit1; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">windows, messages, sysutils, classes, graphics, controls, forms, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">dialogs, stdctrls, buttons, extctrls; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">tfmexample = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">(tform) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">panel1: tpanel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbrun: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">bbclose: tbitbtn; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput: tedit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lboutput: tlabel; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mmoutput: tmemo; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> fmexample: tfmexample; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$r *.dfm}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Объявление экспортируемых функций: </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timesetevent(udelay, ureolution: uint; lptimeproc: pointer; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">dwuser: dword; fuevent: uint): integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> timekillevent(uid: uint): integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">external</span><span class="f_CodeExample" style="color: #ff0000;">'winmm'</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Объявление глобальных переменных </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ueventid: uint; </span><span class="f_CodeExample" style="color: #000080;">// Идентификатор события таймера </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime: tdatetime; </span><span class="f_CodeExample" style="color: #000080;">// Засекаем время&lt; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter: integer; </span><span class="f_CodeExample" style="color: #000080;">// Счетчик повторений </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">delay: word; </span><span class="f_CodeExample" style="color: #000080;">// Период срабатывания </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> proctime(uid, msg: uint; dwuse, dw1, dw2: dword); </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">stdcall</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Реакция на срабатывание таймера (процедура обратного вызова) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> h, m, s, ms: word; </span><span class="f_CodeExample" style="color: #000080;">// Переменные для декодирования времени </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> maxcount = </span><span class="f_CodeExample" style="color: #800000;">55</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Количество повторений </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">timekillevent(ueventid); </span><span class="f_CodeExample" style="color: #000080;">// Останавливаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := counter+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Наращиваем счетчик </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> counter=maxcount </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000080;">// Конец цикла? </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span><span class="f_CodeExample" style="color: #000080;">// - Да: декодируем время </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> decodetime((time-begtime)/maxcount, h, m, s, ms); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmexample.mmoutput.lines.add( </span><span class="f_CodeExample" style="color: #000080;">// Сообщаем результат </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> format(</span><span class="f_CodeExample" style="color: #ff0000;">'Задано %s ms. Получено %d ms'</span><span class="f_CodeExample" style="color: #000000;">, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> [fmexample.edinput.text,ms])); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmexample.edinput.text := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Готовим повторение </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmexample.edinput.setfocus </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #000080;">// - Нет: вновь пускаем таймер </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ueventid := timesetevent(delay,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,@proctime,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.bbrunclick(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Запускает таймер. edinput содержит требуемый период. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Проверяем задание периода </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> edinput.text=</span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delay := strtoint(edinput.text) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> showmessage(</span><span class="f_CodeExample" style="color: #ff0000;">'Ошибка ввода числа'</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.selectall; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edinput.setfocus; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">counter := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">// Сбрасываем счетчик </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">begtime := time; </span><span class="f_CodeExample" style="color: #000080;">// Засекаем время </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Запускаем таймер: </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ueventid := timesetevent(delay,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,@proctime,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ueventid=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> showmessage(</span><span class="f_CodeExample" style="color: #ff0000;">'Ошибка запуска таймера'</span><span class="f_CodeExample" style="color: #000000;">) </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> tfmexample.formactivate(sender: tobject); </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">edinput.setfocus </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">; </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">. </span></p> </td> </tr> </tbody> </table> </div> <p><br /><span style="font-family: 'Times New Roman'; color: #000000;">Источник</span><span style="font-family: 'Times New Roman'; color: #000000;">: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.delphi.h5</span></p> Реализация функции Delay 2013-09-16T14:41:05+07:00 2013-09-16T14:41:05+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/realizatsiya-funktsii-delay.html Super User toto44@inbox.ru <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(dwMilliseconds: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart, iStop: DWORD;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStop := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (iStop - iStart) &gt;= dwMilliseconds;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter</span></p> <p> </p> <p> </p> <p><span style="color: #800000; font-weight: bold;">Примечание от Vit:</span> функция будет "безбожно" жрать процессорное время. Если ожидаемые интервалы задержек достаточно велики, то очень желательно её дополнить следующим образом:</p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(dwMilliseconds: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{©Drkb v.3(2007): www.drkb, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">®Vit (Vitaly Nevzorov) - nevzorov}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart, iStop: DWORD;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStop := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000; font-weight: bold;">sleep(10);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (iStop - iStart) &gt;= dwMilliseconds;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p>Команда Sleep будет отдавать время другим приложением, но точность отмеряемого интервала пострадает на 0.01 секунды, что сопоставимо с общей погрешностью предложенного метода.</p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(msecs: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> targettime: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Msg: TMsg;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> targettime := GetTickCount + msecs;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> targettime &gt; GetTickCount </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> PeekMessage(Msg, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, PM_REMOVE) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> Msg.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">message</span><span class="f_CodeExample" style="color: #000000;"> = WM_QUIT </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PostQuitMessage(msg.wparam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TranslateMessage(Msg);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DispatchMessage(Msg);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Note: </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">The elapsed time is stored as a DWORD value. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Therefore, the time will wrap around to zero if the system is </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">run continuously for 49.7 days. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter.ch</span></p> <p> </p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">The Sleep function suspends the execution of the current </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">thread for a specified interval. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Sleep(dwMilliseconds: Word);</span></p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter</span></p> <p> </p> <p> </p> <p><span style="color: #800000; font-weight: bold;">Примечание от Vit:</span> эта функция страдает многими недостатками, во-первых ни о какой точности речь и не идёт, погрешности среднепотолочные, во-вторых при количестве милисекунд большем 100 функция будет создавать эффект "подвисания" приложения, так как во время её работы приложение не будет отвечать на внешние воздействия. Собственно сама по себе функция sleep вовсе не для отсчёта времени и не для задержки на определённый интервал, её назначение в другом - отдать процессорное время в течение заданного интервала другим процессам. Код можно подправить примерно таким образом:</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay (IntervalinSeconds:integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> i:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{©Drkb v.3(2007): www.drkb, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">®Vit (Vitaly Nevzorov) - nevzorov}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> IntervalinSeconds*</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sleep(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p>Это "поправит" подвисание, но не улучшит точность. Эта функция хороша для задержек на период от секунд до несколько минут когда точность не важна.</p> <p> </p> <p>Можно так же помудрив сделать и возможность прерывания ожидания по нажатию кнопки, примерно так:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Canceled:boolean; </span><span class="f_CodeExample" style="color: #000080;">// должна быть объявлена как глобальная переменная модуля</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">.....</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> Delay (IntervalinSeconds:integer):boolean; </span><span class="f_CodeExample" style="color: #000080;">//возвращает true если отработала не прерываясь</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{©Drkb v.3(2007): www.drkb, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">(Vitaly Nevzorov) - nevzorov@yahoo.com}</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> i:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Canceled:=false; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> IntervalinSeconds*</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sleep(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Canceled </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result:=</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> Canceled;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">........</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.onButton1Click(Sender:TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Canceled:=true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Times New Roman'; color: #ff0000; font-size: 10pt; font-weight: bold;"> </span></p> <p> </p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Including the Sleep in the loop prevents the app from hogging </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">100% of the CPU for doing practically nothing but running around the loop. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> PauseFunc(delay: DWORD);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lTicks: DWORD;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lTicks := GetTickCount + delay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sleep(</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (lTicks &lt;= GetTickCount) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> Application.Terminated;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter.ch</span></p> <p> </p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(Milliseconds: Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{by Hagen Reddmann}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Tick: DWord;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Event: THandle;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Event := CreateEvent(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, False, False, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Tick := GetTickCount + DWord(Milliseconds);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (Milliseconds &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (MsgWaitForMultipleObjects(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Event, False, Milliseconds, QS_ALLINPUT) &lt;&gt; WAIT_TIMEOUT) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Milliseconds := Tick - GetTickcount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">finally</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CloseHandle(Event);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter</span></p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(dwMilliseconds: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart, iStop: DWORD;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStop := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (iStop - iStart) &gt;= dwMilliseconds;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter</span></p> <p> </p> <p> </p> <p><span style="color: #800000; font-weight: bold;">Примечание от Vit:</span> функция будет "безбожно" жрать процессорное время. Если ожидаемые интервалы задержек достаточно велики, то очень желательно её дополнить следующим образом:</p> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(dwMilliseconds: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{©Drkb v.3(2007): www.drkb, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">®Vit (Vitaly Nevzorov) - nevzorov}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart, iStop: DWORD;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStart := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> iStop := GetTickCount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000; font-weight: bold;">sleep(10);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (iStop - iStart) &gt;= dwMilliseconds;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p>Команда Sleep будет отдавать время другим приложением, но точность отмеряемого интервала пострадает на 0.01 секунды, что сопоставимо с общей погрешностью предложенного метода.</p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(msecs: Longint);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> targettime: Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Msg: TMsg;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> targettime := GetTickCount + msecs;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> targettime &gt; GetTickCount </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> PeekMessage(Msg, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, PM_REMOVE) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">If</span><span class="f_CodeExample" style="color: #000000;"> Msg.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">message</span><span class="f_CodeExample" style="color: #000000;"> = WM_QUIT </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PostQuitMessage(msg.wparam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TranslateMessage(Msg);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DispatchMessage(Msg);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Note: </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">The elapsed time is stored as a DWORD value. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Therefore, the time will wrap around to zero if the system is </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">run continuously for 49.7 days. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter.ch</span></p> <p> </p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">The Sleep function suspends the execution of the current </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">thread for a specified interval. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Sleep(dwMilliseconds: Word);</span></p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter</span></p> <p> </p> <p> </p> <p><span style="color: #800000; font-weight: bold;">Примечание от Vit:</span> эта функция страдает многими недостатками, во-первых ни о какой точности речь и не идёт, погрешности среднепотолочные, во-вторых при количестве милисекунд большем 100 функция будет создавать эффект "подвисания" приложения, так как во время её работы приложение не будет отвечать на внешние воздействия. Собственно сама по себе функция sleep вовсе не для отсчёта времени и не для задержки на определённый интервал, её назначение в другом - отдать процессорное время в течение заданного интервала другим процессам. Код можно подправить примерно таким образом:</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay (IntervalinSeconds:integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> i:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{©Drkb v.3(2007): www.drkb, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">®Vit (Vitaly Nevzorov) - nevzorov}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> IntervalinSeconds*</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sleep(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p>Это "поправит" подвисание, но не улучшит точность. Эта функция хороша для задержек на период от секунд до несколько минут когда точность не важна.</p> <p> </p> <p>Можно так же помудрив сделать и возможность прерывания ожидания по нажатию кнопки, примерно так:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Canceled:boolean; </span><span class="f_CodeExample" style="color: #000080;">// должна быть объявлена как глобальная переменная модуля</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">.....</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Function</span><span class="f_CodeExample" style="color: #000000;"> Delay (IntervalinSeconds:integer):boolean; </span><span class="f_CodeExample" style="color: #000080;">//возвращает true если отработала не прерываясь</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{©Drkb v.3(2007): www.drkb, </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">(Vitaly Nevzorov) - nevzorov@yahoo.com}</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> i:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Canceled:=false; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">For</span><span class="f_CodeExample" style="color: #000000;"> i:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> IntervalinSeconds*</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sleep(</span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Canceled </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result:=</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> Canceled;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">........</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.onButton1Click(Sender:TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Canceled:=true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Times New Roman'; color: #ff0000; font-size: 10pt; font-weight: bold;"> </span></p> <p> </p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Including the Sleep in the loop prevents the app from hogging </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">100% of the CPU for doing practically nothing but running around the loop. </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> PauseFunc(delay: DWORD);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lTicks: DWORD;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lTicks := GetTickCount + delay;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sleep(</span><span class="f_CodeExample" style="color: #800000;">100</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (lTicks &lt;= GetTickCount) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> Application.Terminated;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter.ch</span></p> <p> </p> <p> </p> <hr size="1" noshade="noshade" style="color: #000000;" /> <p> </p> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Delay(Milliseconds: Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{by Hagen Reddmann}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Tick: DWord;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Event: THandle;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Event := CreateEvent(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">, False, False, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Tick := GetTickCount + DWord(Milliseconds);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (Milliseconds &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (MsgWaitForMultipleObjects(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Event, False, Milliseconds, QS_ALLINPUT) &lt;&gt; WAIT_TIMEOUT) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Application.ProcessMessages;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Milliseconds := Tick - GetTickcount;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">finally</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CloseHandle(Event);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято с сайта: </span><span style="font-family: 'Times New Roman'; color: #0000ff; text-decoration: underline;">https://www.swissdelphicenter</span></p> Скорость работы процессора, точный таймер 2013-08-22T20:42:50+07:00 2013-08-22T20:42:50+07:00 https://delphi-hlp.ru/index.php/rabota-s-datami-i-vremenem/tajmer-i-zaderzhki-vypolneniya-delay/skorost-raboty-protsessora-tochnyj-tajmer.html Super User toto44@inbox.ru <p>Данная тема уже обсуждалась, но у меня есть своя реализация сабжа. Начиная с Pentium MMX, Intel ввели в процессор счетчик тактов на 64 бита (Присутствует точно и в К6). Для того чтобы посмотреть на его содержание, была введена команда "rdtsc" (подробное описание в интеловской мануале). Эту возможность можно использовать для реализации сабжа.</p> <p>Поскольку Дельфи не в курсе насчет rdtsc, то пришлось юзать опкод (0F31).</p> <p>Привожу простенький примерчик юзания, Вы уж извините - немножко кривоват получился, да и ошибка компилятора какая-то вылезла :( (V4 Bld5.104 Upd 2). Кому интересно, поделитесь своими соображениями по этому поводу. Особенно интересует работа в режиме когда меняется частота процессора (Duty Cycle, Standby).</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// (C) 1999 ISV</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Controls, Forms,Dialogs, StdCtrls, Buttons, ExtCtrls;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span><span class="f_CodeExample" style="color: #000000;"> TForm1 = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">(TForm)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label1: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer1: TTimer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label2: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label3: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Button1: TButton;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Button2: TButton;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label4: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Timer1Timer(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FormActivate(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Button1Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Button2Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">private</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Private declarations }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">public</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Public declarations }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Counter:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Счетчик срабатывания таймера </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Start:int64; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Начало роботы </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Previous:int64; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Предыдущее значение </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PStart,PStop:int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Для примера выч. времени </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CurRate:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Текущая частота проца </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> GetCPUClick:int64; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> GetTime(Start,Stop:int64):double;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Form1: TForm1;</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span><span class="f_CodeExample" style="color: #0000ff;">{$R *.DFM}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Функция работает на пнях ММХ или выше а</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// также проверялась на К6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> TForm1.GetCPUClick:int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span><span class="f_CodeExample" style="color: #000000;"> db 0fh,31h </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Опкод для команды rdtsc mov dword ptr result,eax mov dword ptr result[4],edx </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Не смешно :(. Без ?той штуки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Компайлер выдает Internal error C1079 </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result:=Result;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Время в секундах между старт и стоп</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> TForm1.GetTime(Start,Stop:int64):double;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span><span class="f_CodeExample" style="color: #000000;"> result:=(Stop-Start)/CurRate </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span><span class="f_CodeExample" style="color: #000000;"> result:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Обработчик таймера считает текущую частоту, выводит ее, а также</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// усредненную частоту, текущий такт с момента старта процессора.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// При постоянной частоте процессора желательно интервал братьпобольше</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// 1-5с для точного прощета частоты процессора.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.Timer1Timer(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> i:int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i:=GetCPUClick;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Counter=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Start:=i </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label2.Caption:=Format(</span><span class="f_CodeExample" style="color: #ff0000;">'Частота общая:%2f'</span><span class="f_CodeExample" style="color: #000000;">,[(i-Start)/(Counter*Timer1.Interval*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label3.Caption:=Format(</span><span class="f_CodeExample" style="color: #ff0000;">'Частота текущая:%2f'</span><span class="f_CodeExample" style="color: #000000;">,[(i-Previous)/(Timer1.Interval*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CurRate:=Round(((i-Previous)*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)/(Timer1.Interval));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Label1.Cap примера</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.Button1Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PStart:=GetCPUClick;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Останавливаем отсчет времени и показуем соко</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// прошло секунд</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.Button2Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PStop:=GetCPUClick;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Label4.Caption:=Format!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Время между нажатиями:%gсек'</span><span class="f_CodeExample" style="color: #000000;">,[GetTime(PStart,PStop)])</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p>Данная тема уже обсуждалась, но у меня есть своя реализация сабжа. Начиная с Pentium MMX, Intel ввели в процессор счетчик тактов на 64 бита (Присутствует точно и в К6). Для того чтобы посмотреть на его содержание, была введена команда "rdtsc" (подробное описание в интеловской мануале). Эту возможность можно использовать для реализации сабжа.</p> <p>Поскольку Дельфи не в курсе насчет rdtsc, то пришлось юзать опкод (0F31).</p> <p>Привожу простенький примерчик юзания, Вы уж извините - немножко кривоват получился, да и ошибка компилятора какая-то вылезла :( (V4 Bld5.104 Upd 2). Кому интересно, поделитесь своими соображениями по этому поводу. Особенно интересует работа в режиме когда меняется частота процессора (Duty Cycle, Standby).</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// (C) 1999 ISV</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Controls, Forms,Dialogs, StdCtrls, Buttons, ExtCtrls;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span><span class="f_CodeExample" style="color: #000000;"> TForm1 = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span><span class="f_CodeExample" style="color: #000000;">(TForm)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label1: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Timer1: TTimer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label2: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label3: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Button1: TButton;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Button2: TButton;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label4: TLabel;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Timer1Timer(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FormActivate(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Button1Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Button2Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">private</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Private declarations }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">public</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ Public declarations }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Counter:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Счетчик срабатывания таймера </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Start:int64; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Начало роботы </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Previous:int64; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Предыдущее значение </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PStart,PStop:int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Для примера выч. времени </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CurRate:integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Текущая частота проца </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> GetCPUClick:int64; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> GetTime(Start,Stop:int64):double;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Form1: TForm1;</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span><span class="f_CodeExample" style="color: #0000ff;">{$R *.DFM}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Функция работает на пнях ММХ или выше а</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// также проверялась на К6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> TForm1.GetCPUClick:int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span><span class="f_CodeExample" style="color: #000000;"> db 0fh,31h </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Опкод для команды rdtsc mov dword ptr result,eax mov dword ptr result[4],edx </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Не смешно :(. Без ?той штуки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Компайлер выдает Internal error C1079 </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result:=Result;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Время в секундах между старт и стоп</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> TForm1.GetTime(Start,Stop:int64):double;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span><span class="f_CodeExample" style="color: #000000;"> result:=(Stop-Start)/CurRate </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span><span class="f_CodeExample" style="color: #000000;"> result:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Обработчик таймера считает текущую частоту, выводит ее, а также</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// усредненную частоту, текущий такт с момента старта процессора.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// При постоянной частоте процессора желательно интервал братьпобольше</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// 1-5с для точного прощета частоты процессора.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.Timer1Timer(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> i:int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i:=GetCPUClick;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Counter=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Start:=i </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label2.Caption:=Format(</span><span class="f_CodeExample" style="color: #ff0000;">'Частота общая:%2f'</span><span class="f_CodeExample" style="color: #000000;">,[(i-Start)/(Counter*Timer1.Interval*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Label3.Caption:=Format(</span><span class="f_CodeExample" style="color: #ff0000;">'Частота текущая:%2f'</span><span class="f_CodeExample" style="color: #000000;">,[(i-Previous)/(Timer1.Interval*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CurRate:=Round(((i-Previous)*</span><span class="f_CodeExample" style="color: #800000;">1000</span><span class="f_CodeExample" style="color: #000000;">)/(Timer1.Interval));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Label1.Cap примера</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.Button1Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PStart:=GetCPUClick;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Останавливаем отсчет времени и показуем соко</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// прошло секунд</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.Button2Click(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PStop:=GetCPUClick;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Label4.Caption:=Format!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #ff0000;">'Время между нажатиями:%gсек'</span><span class="f_CodeExample" style="color: #000000;">,[GetTime(PStart,PStop)])</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div>