Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 34

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Аппаратный Ρ‚Π°ΠΉΠΌΠ΅Ρ€

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ рассматриваСмый способ измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ основан Π½Π° использовании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° высокого Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (высокочастотного). Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρƒ Β«Ρ‚ΠΈΠΊΠ°ΠΌΠΈΒ» этого Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ мСньшС 1 мс, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ достаточно Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ измСрСния. Для сохранСния количСства Β«Ρ‚ΠΈΠΊΠΎΠ²Β» Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 64-Π±ΠΈΡ‚Π½Ρ‹ΠΉ счСтчик.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ получСния значСния счСтчика Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° приводится Π² листингС 7.8. Частота, возвращаСмая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ hwTimerGetCounter, измСряСтся Π² Π“Ρ† (с-1), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ количСство срабатываний Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² 1 с.

...

Листинг

7.8. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния счСтчика Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

function hwTimerGetCounter(): Int64;

var

freq: Int64;

begin

if QueryPerformanceCounter(freq) <> False then

hwTimerGetCounter := freq

else

hwTimerGetCounter := 0; //Ошибка

end;

Π§Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти количСство Β«Ρ‚ΠΈΠΊΠΎΠ²Β» Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Π΅ Π½Π°ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ измСрСния, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΅Π³ΠΎ частоту. Π’ этом Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ функция, привСдСнная Π² листингС 7.9.

...

Листинг 7.9.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ частоты Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

function hwTimerGetFreq(): Int64;

var

freq: Int64;

begin

if QueryPerformanceFrequency(freq) <> False then

hwTimerGetFreq := freq

else

hwTimerGetFreq := 0; //Ошибка

end;

ΠŸΡƒΡΡ‚ΡŒ Π½Π°ΠΌ извСстна Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ значСния счСтчика Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ измСрСния. ΠŸΠ΅Ρ€Π΅Π²Π΅ΡΡ‚ΠΈ Π΅Π΅ Π² сСкунды ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

time:= counter div hwTimerGetFreq();

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ опрСдСлСния характСристик Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π° рис. 7.4.

Рис. 7.4. Π₯арактСристики Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½Π° рис. 7.4 тСкстовых ΠΏΠΎΠ»Π΅ΠΉ осущСствляСтся Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ просто, поэтому ΠΊΠΎΠ΄, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ это, Π² тСкстС Π½Π΅ приводится. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ смоТСтС Π½Π°ΠΉΡ‚ΠΈ Π΅Π³ΠΎ Π½Π° дискС, ΠΏΡ€ΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊ ΠΊΠ½ΠΈΠ³Π΅, Π² ΠΏΠ°ΠΏΠΊΠ΅ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π°.

ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Ρ‚Π°ΠΉΠΌΠ΅Ρ€

Рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ измСрСния, основанный Π½Π° использовании Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π•Π³ΠΎ использованиС ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ задания Π΅Π³ΠΎ точности. Π“Ρ€ΡƒΠΏΠΏΠ° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ позволяСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹, Π½ΠΎ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ (см. ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Timer), ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшиС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Для получСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния счСтчика ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ timeGetTime. Π’ΠΎΠΎΠ±Ρ‰Π΅, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ значСниям, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetTickCount. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ Ρ‚Π°ΠΊΠΆΠ΅ 32-Π±ΠΈΡ‚Π½Ρ‹ΠΉ, обнуляСмый ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 49,7 суток. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeGetTime ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:...

function timeGetTime: DWORD; stdcall;

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.12, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ нСсколько слов ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ для рассматриваСмого Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° значСния минимальной ΠΈ максимальной точности. Для получСния этих Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ timeGetDevCaps. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° структуру TTimeCaps ΠΈ заполняСт Π΄Π²Π° Π΅Π΅ поля ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями. Π’ листингС 7.10 приводится возмоТная рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для опрСдСлСния характСристик ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°.

...

Листинг 7.10.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ характСристик ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ максимального ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (мс)

function timeGetMaxPeriod(): Cardinal;

var

time: TTimeCaps;

begin

timeGetDevCaps(Addr(time), SizeOf(time));

timeGetMaxPeriod := time.wPeriodMax;

end;

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ минимального ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (мс)

function timeGetMinPeriod(): DWORD;

var

time: TTimeCaps;

begin

timeGetDevCaps(Addr(time), SizeOf(time));

timeGetMinPeriod := time.wPeriodMin;

end;

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Но Π±Ρ‹Π»ΠΎ сказано, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ДСлаСтся это ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ timeBeginPeriod ΠΈ timeEndPeriod.

β€’ ΠŸΠ΅Ρ€Π²Π°Ρ функция вызываСтся для установлСния минимальной точности Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, которая устраиваСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Ѐункция timeBeginPeriod ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ точности Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² миллисСкундах, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TIMERR_NOERROR Π² случаС успСха Π»ΠΈΠ±ΠΎ Π’ IMERR_NOCANDO, Ссли трСбуСмая Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ обСспСчСна.

β€’ Вторая функция восстанавливаСт Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeBeginPeriod. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ timeEndPeriod Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ timeBeginPeriod.

Π’ листингС 7.11 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈ ΠΈ timeBeginPeriod, Π°Ρ‚Π°ΠΊΠΆΠ΅ timeEndPeriod (Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ). ΠŸΡ€ΠΈ пользовании функциями ΠΈΠ· листинга 7.11 Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ послС Π²Ρ‹Π·ΠΎΠ²Π° timeSetTimerPeriod ΠΈ провСдСния измСрСния ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° timeRestoreTimerPeriod. Ѐункция timeSetTimerPeriod сохраняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСнной точности Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ lastPeriod, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ сохранСнии этого значСния Π² ΠΊΠΎΠ΄Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€.

...

Листинг 7.11. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ измСнСния точности Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

Var lastPeriod: Cardinal;

//Установка ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (мс) ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ измСрСния

function timeSetTimerPeriod(period: Cardinal): Boolean;

begin

if timeBeginPeriod(period) = TIMERR_NOERROR then

begin

//Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для восстановлСния состояния Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

lastPeriod := period;

timeSetTimerPeriod := True;

end

else

//НСудача

timeSetTimerPeriod := False;

end;

//ВосстановлСниС ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)

function timeRestoreTimerPeriod(): Boolean;

begin

if timeEndPeriod(lastPeriod) = TIMERR_NOERROR then

timeRestoreTimerPeriod := True

else

timeRestoreTimerPeriod := False;

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС Π΄ΠΎΠ»Π³ΠΎΠ³ΠΎ рассмотрСния особСнностСй настройки ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Π³ΠΎ использования для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (листинг 7.12).

...

Листинг 7.12.

Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

procedure TForm1.cmbTimeGoClick(Sender: TObject);

var

summ, arg, maxVal: Int64;

startTime, endTime: Cardinal;

begin

txtTimeResult.Text := \'Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅β€¦\

Refresh;

maxVal := StrToInt(txtTimeMaxVal.Text);

//УстанавливаСм ΠΌΠ°ΡΠΊΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

timeSetTimerPeriod(timeGetMinPeriod());

startTime := timeGetTime(); //ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

//Π‘ΡƒΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ 64-Π±ΠΈΡ‚Π½Ρ‹Π΅ числа

//(ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ измСряСм врСмя Π΅Π³ΠΎ выполнСния)

summ := 0;

arg := 1;

while (arg <= maxVal) do

begin

Inc(summ, arg);

Inc(arg);

end;

endTime := timeGetTime(); //ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

//ВосстанавливаСм ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

timeRestoreTimerPeriod();

//ВрСмя выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (мс)

txtTimeResult.Text := IntToStr(endTime – startTime);

end;

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° высокой точности

Π’ самом Π½Π°Ρ‡Π°Π»Π΅ рассмотрСния возмоТностСй ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π±Ρ‹Π»ΠΎ сказано, Ρ‡Ρ‚ΠΎ Π² Π΅Π³ΠΎ API Π·Π°Π»ΠΎΠΆΠ΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ². Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ максимальная Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ довольно большой: Π½Π° соврСмСнных ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… созданиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° с ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠΌ срабатывания 1 мс – Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠŸΡ€Π°Π²Π΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ частоту Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° вряд Π»ΠΈ стоит: слишком Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ошибки ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° 1 мс.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ уясним, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΌΡ‹ создаСм ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ отличаСтся ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Timer, ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ. А отличаСтся наш Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΡ€ΠΎΠΌΠ΅ высокой точности, Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊ ΠΎΠΊΠ½Ρƒ (Ρ„ΠΎΡ€ΠΌΠ΅): ΠΏΡ€ΠΈ срабатывании стандартного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Timer ΠΎΠΊΠ½Ρƒ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½, посылаСтся сообщСниС WM_TIMER. Π‘ΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΆΠ΅ Π½Π°ΠΌΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

...

timerID := timeSetEvent

(

StrToInt(txtTimeInterval.Text), //Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρƒ

//срабатываниями Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

timeGetMinPeriod(), //Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

TimerProc, //АдрСс ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ

//срабатывании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

0, //ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ

//ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°

TIME_CALLBACK_FUNCTION or TIME_PERIODIC //Π’ΠΈΠΏ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

);

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΡ‚Ρ€Ρ‹Π²ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeSetEvent происходит рСгистрация ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ адрСса ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ TimerProc, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ пСриодичСски ΠΏΡ€ΠΈ срабатываниях Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ создании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° функция timeSetEvent Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ – ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ созданного Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Оно ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² дальнСйшСм для опрСдСлСния, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ сработал. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ timeSetEvent, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°:

...

timeKillEvent(timerlD);

Ѐункция timeKillEvent Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

β€’ TIMERR_NOERROR – Ссли Π΅Π΅ Π²Ρ‹Π·ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ;

β€’ MMSYSERR_INVALPARAM – Ссли Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ сущСствуСт.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ timeSetEvent. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½Π° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 7.13).

...

Листинг 7.13.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°, вызываСмая ΠΏΡ€ΠΈ срабатывании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

procedure TimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2:

DWORD) stdcall;

begin

//ДобавляСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² список (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π°

//Π²ΠΈΠ΄Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π° этой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹)

Form1.lstTimes.Items.Add(IntToStr(timeGetTime()));

end;

ЕстСствСнно, дСйствия, выполняСмыС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ TimerProc, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ самыми Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Π’ нашСм случаС происходит Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ списка (List) значСниями счСтчика Β«Ρ‚ΠΈΠΊΠΎΠ²Β» Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ (рис. 7.5).

Рис. 7.5. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ вновь обратимся ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeSetEvent: ΠΊΡ€Π°Ρ‚ΠΊΠΎ пСрСчислим прСдоставляСмыС Сю возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ Π½Π΅ воспользовались Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Как Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeSetEvent являСтся Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маской. Π€Π»Π°Π³ΠΈ этой маски Π·Π°Π΄Π°ΡŽΡ‚ Π΄Π²Π° аспСкта повСдСния Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°: количСство срабатываний Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈ Ρ‚ΠΈΠΏ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ срабатывании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°.