1.Scopul lucrarii: De studiat metodele si principiile de lucru cu timer-ul.
2.Sarcina lucrarii: De scris un program, care realizeaza urmatoarele.
- Un ceas digital (ora:min:sec), utilizind timerul pentru reinoirea la fiecare secunda.
- Un ceas analogic( de desena ciferblatul si arcele, utilizind primitivele GDI ), utilizind timer-ul pentru reinoirea la
fiecare secunda.
3. Intrebari de control:
3.1. Enumerati principalele intrebiuntari ale ceasului de sistem.
3.2. Este posibila activarea simultana a citorva ceasuri ? Daca da, atunci cite ceasuri pot fi activate simultan in
sistemul windows?
3.3. Care este destinatia intreruperii 08h?
3.4. Din ce cauza intreruperea de ceas este o intrerupere asinctona?
3.5. Care este instructiunea de alocare a ceasului? Descrieti parametrii.
4. Raspunsuri la intrebari:
4.1. In primul rind, ceasul se utilizeaza pentru evidenta timpului. Ceasul de sistem se utilizeaza pentru pastrarea
unui raport referitor la starea resurselor sistemului windows, functioneaza pentru postalarma. Asigura facilitatea
multitasking, in acest context este important faptul ca programele inapoiaza cit de curind posibil, daca un program
trebuie sa faca multe prelucrari, el poate imparti aceste proceduri in unitati mai mici si le poate prelucra pe fiecare la
primirea mesajelor WM_TIMER.De asemenea ceasul de sistem implimenteaza caracteristica de autosalvare.
4.2. Da, activarea simultana a mai multor ceasuri este posibila. Pentru a activa un ceas se apeleaza functia
SetTimer( HWND, UINT_PTR, UINT, TIMERPROC ); unde al doilea parametru identifica ceasul, precul
este de tipul UINT_PTR care este intre limitele de la 0 la 231-1, respectiv numarul de ceasuri care se poate activat,
pentru compilatorul Microsoft Visual Studio 2005.
4.3. Intreruperea 08h sau “clock tick timer tick”in este destinata pentru actualizarea valorii
corespunzatoare a timpului la fiecare 54 925ms sau aproximativ 18.2ori pe secunda. MS-Dos utilizeaza aceste
valori pentru a calcula timpul curent. Iar aplicatiile non-Windows prin interceptarea intreruperii 08h formeaza
intreruperea de ceas.
4.4. Deoarece se produce aleator in raport cu programul pe care il intrerupe, ca si intreruperile efectuate de mouse sau
tastatura. Dar mesajele WM_TIMER nu sint asincrone deoarece ele se plaseaza in coada de mesaje.
4.5. Functia de alocare a unui ceas este SetTimer( HWND hwnd, UINT_PTR id, UINT ms, TIMERPROC lpfn );
Unde: hwnd- prin acest parametru fuctia afla carei ferestre sa ii aloce ceasul.
id- numarul de identificare in cadrul ferestrei, destinatia pentru a aloca mai multe timere.
ms- timpul in milisecunde, peste care fereastra va primi mesaje WM_TIMER.
lpfn- long pointer to timer function, are destinatia de actualiza ferestre derivate a ferestrei de baza.
5.Listingul programului (efectuat in Visual Studio 2005) :
#include "stdafx.h"
#include "Timer.h"
#include <list>
#include <time.h>
#include <math.h>
#define MAX 100
#define TIMER_SEC 1
#define SECUNDE 1000
#define MoveTo( hdc, x, y ) MoveToEx( hdc, x, y, NULL );
using namespace std;
TCHAR ClassName[MAX]; TCHAR ClassTitle[MAX];
void LoadTCHAR( const char *, TCHAR *);
//------------------------- Structura Rect pentru linii -----------------------
struct MyRECT
{ long _left; long _top;
long _right;long _bottom;
int _center_x; int _center_y;
MyRECT()
:_left(0), _right(0),
_top(0), _bottom(0),
_center_x(0), _center_y(0){};
MyRECT( long left, long top, long right, long bottom )
:_left(left), _right(right),
_top(top), _bottom(bottom),
_center_x(left+(right-left)/2),
_center_y( top+(bottom-top)/2){};
void set_rect( long left, long top, long right, long bottom )
{ _bottom = bottom; _left = left ;
_top = top ; _right = right ;
_center_x=(left+(right-left)/2);
_center_y=(top+(bottom-top)/2);}
virtual ~MyRECT(){}; };
//------------------------- Classa pentru desenarea liniilor-------------------
class LINE: public MyRECT
{ public:LINE(): MyRECT( 0, 0, 0, 0 ){ };
LINE( long left, long top, long right, long bottom )
: MyRECT( left, top, right, bottom ){};
void show_figure( const HDC &hdc )const
{ MoveTo( hdc, _left, _top );
LineTo( hdc, _right, _bottom );}
void set_line( long left, long top, long right, long bottom )
{ set_rect( left, top, right, bottom );}
};
Exeplu de realizare a interceptarii intreruperilor de sistem prin afisarea orei intr-o fereastra. exemplul facut in C++
Documentul este oferit gratuit,
trebuie doar să te autentifici in contul tău.