[ Pobierz całość w formacie PDF ]
.Ich omawianie wykracza jednak poza ramy tego rozdziału (informacje na ten temat można znaleźć w rozdziale 16.- przyp.tłum.).Dokładne odmierzanie czasuElementarną obsługę odmierzania czasu zapewnia komponent VCL TTimer, wykorzystujący funkcje pomiaru czasu dostępne w systemie Win32.Do uruchomienia i zatrzymania generowania zdarzeń zegara służą odpowiednio wywołania funkcji SetTimer() i KillTimer(), zaś same zdarzenia (sygnalizowane systemowymi komunikatami WM_TIMER) reprezentowane są przez zdarzenie OnTimer.Wywołanie funkcji SetTimer() nakazuje systemowi operacyjnemu cykliczne wysyłanie komunikatów do wywołującego okna, aż do chwili „zatrzymania” zegara funkcją KillTimer().Częstotliwość generowania komunikatów ustalana jest parametrem timeout wywołania funkcji SetTimer() (w bibliotece VCL odpowiada mu właściwość Interval komponentu TTimer).Co prawda żądana długość odstępu pomiędzy kolejnymi „tyknięciami” podawana jest z dokładnością jednej milisekundy, jednak praktyczna dokładność zegara systemowego jest o wiele niższa - komunikaty WM_TIMER mogą pojawiać się przed lub po upływie zadanego czasu (zwłaszcza w przypadku dużego obciążenia procesora).Ogólnie rzecz biorąc, na stabilności zegara systemowego lepiej nie polegać.Na szczęście istnieje dokładniejsza alternatywa - jest nią system odmierzania czasu zaimplementowany w podsystemie obsługi multimediów, zapewniający znacznie lepszą dokładność i rozdzielczość niż standardowy mechanizm oparty na funkcji SetTimer().Rzut oka na zawartość pliku mmsystem.h (dostępny zarówno w pakiecie C++Builder, jak i w plikach bibliotecznych Microsoftu) ujawnia następujące deklaracje:/* obsługa systemu odmierzania czasu */WINMMAPI MMRESULT WINAPI timeGetSystemTime(LPMMTIME pmmt, UINT cbmmt);WINMMAPI DWORD WINAPI timeGetTime(void);WINMMAPI MMRESULT WINAPI timeSetEvent(UINT uDelay, UINT uResolution,LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent);WINMMAPI MMRESULT WINAPI timeKillEvent(UINT uTimerID);WINMMAPI MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc);WINMMAPI MMRESULT WINAPI timeBeginPeriod(UINT uPeriod);WINMMAPI MMRESULT WINAPI timeEndPeriod(UINT uPeriod);Do większości zastosowań wystarcza użycie funkcji timeSetEvent() i timeKillEvent().Przykład prostego programu porównującego dokładność zegara systemowego i multimedialnego przedstawiono na wydruku 14.7; kompletny kod źródłowy można znaleźć w katalogu MMTimer na załączonej do książki płycie CD-ROM.Wynik wykonania programu, ilustrujący rozbieżności pomiędzy obydwoma zegarami, pokazano na rysunku 14.4.Rysunek 14.4.Rozbieżność pomiędzy zegarem systemowym (komponent TTimer) i multimedialnymWydruk 14.7.Demonstracja działania systemu odmierzania czasu z biblioteki MMSYSTEM#include <vcl.h>#pragma hdrstop#include "mmtimer.h"#include <mmsystem.h>#include <time.h>//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){MMTimerID = 0;MMlasttime = 0;STANlasttime = 0;clicksMM = 0;clicksST = 0;}//---------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender){unsigned int clocktime = clock();EditStandardTimer->Text = AnsiString(clocktime - STANlasttime);STANlasttime = clocktime;clicksST++;EditClicksST->Text = clicksST;}//---------------------------------------------------------------------------void __fastcall TForm1::HandleMMTimerEvent(){unsigned int clocktime = clock();EditMMTimer->Text = AnsiString(clocktime - MMlasttime);MMlasttime = clocktime;clicksMM++;EditClicksMM->Text = clicksMM;//Refresh();}//---------------------------------------------------------------------------void CALLBACK TimerProc(unsigned int uID, unsigned int uMsg, DWORD dwUser,DWORD dw1, DWORD dw2){Form1->HandleMMTimerEvent();}//---------------------------------------------------------------------------void __fastcall TForm1::SpeedButtonMMTimerClick(TObject *Sender){if (SpeedButtonMMTimer->Down){int Interval = EditInterval->Text.ToIntDef(0);int Resolution = EditResolution->Text [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • matkasanepid.xlx.pl