Sunteți pe pagina 1din 7

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatica si Microelectronica

RAPORT
Lucrarea de laborator nr.6
Programarea in Windows

A efectuat:

A verificat:
lect., univ. Lisnic Inga

Chisinau 2017

Tema: Ceasul sistemului Windows


Scopul lucrarii: De a studia metodele şi principiile de lucru cu timer-ul

Sarcina de lucru: De scris un program, care realizează următoarele:


1. un ceas digital (Ora:Min:Sec), utilizând timer-ul pentru reînnoirea la fiecare secundă.
2. un ceas analogic (de desenat ciferblatul şi arcele, utilizând primitivele GDI), utilizând timer-ul pentru
reînnoirea la fiecare secundă.

Notiuni teoretice
Ceasul sistemului Windows este un dispozitiv de intrare, care comunică (periodic) unei aplicații intervalul
de timp scurs; ulterior, mediul de operare trimite programului mesaje WM_TIMER, pentru a semnala
intervalele de timp scurse. În continuare vom reda câteva din întrebuințările ceasului.În primul rînd, ceasul
se utilizează pentru evidența timpului. Programele CLOCK și CONTROL PANEL afișează timpul curent;
timer-ul indică aplicațiilor momentul de timp cînd trebuie să acutalizeze ceasul.Ceasul de sistem se
utilizează pentru păstrarea unui raport referitor la starea resurselor sistemului Windows; funcționează pe
post de alarmă (programul CALENDAR poate utiliza timer-ul pentru a declanșa o alarmă
prestabilită).Asigură facilitatea multitasking – Windows este un sistem ce posedă caracteristica
nonpriemptive multitasking; în acest context, este important faptul că programele înapoiază controlul
mediului cît de curînd posibil. Dacă un program trebuie să facă multe prelucrări, el poate împărți aceste
proceduri în unități mai mici și le poate prelucra pe fiecare la primirea mesajlui WM_TIMER.De
asemenea, ceasul de sistem implementează caracteristica de autosalvare – indică unei aplicații Windows
să salveze fișierele unui utilizator pe discm după ce a trecut un interval de timp. Asigură terminarea
versiunilor demo ale diverselor programe.

1. Enumerati principalele intrebuintari ale ceasului de sistem?


Ceasul are rol de a sincroniza toate procesele in sistemul de operare. Sistemul de operare trebuie sa
stie cit timp are el nevoie pentru a executa fiecare proces. Pentru crearea unor programe functionale
citeodata este nevoie de ceas.

2. Este posibila activarea simultana a citeva ceasuri? Daca da atunci cite pot fi activate simultan
in sistemul Windows?
Primele versiuni de Windows aveau un numar limitat de ceasuri pe care puteai sa le pornesti la
momentul actual numarul de ceasuri pe care le poate porni sistemul de operare si programele practic
este infinit

3. Care este destinatia intreruperii 08h?

1
Ceasul sistemului Windows, reprezinta o extensie simpla a logicii aferente timerului, incorporata in
hard-ul
PC-ului si in ROM BIOS. Aceasta din urma initializeaza un ceas Intel pentru a genera intrerupere 08h,
care mai este denumita “clock tick timer tick”. O astfel de intrerupere se produce la fiecare 54 925ms,
ceea ce constituie aproximativ 18.2 ori pe secunda.

4. Din ce cauza inreruperea de ceas este intrerupere asincrona?


Ca si intreruperea generate de tastatura si soricel, intreruperea de ceas este denumita intrerupere
asincrona, deoarece se produce aleator in raport cu programul pe care il intrerupe.

5. Care este instructiunea de alocare a ceasului? Descrieti parametrii.


Pentem aloca un timer pentru programul nostru Windows prin apelarea functiei SetTimer.
Aceasta instructiune include un parametru ce specifica un interval de timp ce poate varia de la 1ms la
65535 ms. Valoarea indica viteza cu care Windows expediaza mesaje WM_TIMER. De exeplu, un
interval de 1000 ms determina sistemul sa trimita acest mesaj la fiecare secunda. Dupa ce programul
nostru a finisat utilizarea ceasului, el apeleaza functia KillTimer, pentru a opri mesajele referitoare la
timer.

Listingul programului

#include <windows.h>
#include "class.h"
#include <time.h>
#include <math.h>
#define ID_TIMER 1
#define TWOPI (2 * 3.14159)
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int iCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = NULL;
wndclass.cbWndExtra = NULL;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, NULL);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = NULL;//(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Time";
wndclass.hIconSm = LoadIcon(NULL, NULL);
RegisterClassEx(&wndclass);
hWnd = CreateWindow("Time", "Time",
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT,
2
CW_USEDEFAULT,
345,
395,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
nTime.LoadBmp();
nTime.Init();
SetTimer(hWnd,1,0,NULL);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
KillTimer(hWnd,1);
return 0;
}
void SetIsotropic (HDC hdc, int cxClient, int cyClient){
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL) ;
SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2.4, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2.4, NULL) ;
}

void RotatePoint (POINT pt[], int iNum, int iAngle){


int i ;
POINT ptTemp ;
for (i = 0 ; i < iNum ; i++){
ptTemp.x = (int) (pt[i].x * cos (TWOPI * iAngle / 360) + pt[i].y * sin
(TWOPI * iAngle / 360)) ;
ptTemp.y = (int) (pt[i].y * cos (TWOPI * iAngle / 360) - pt[i].x * sin
(TWOPI * iAngle / 360)) ;
pt[i] = ptTemp ;
}
}

void DrawClock (HDC hdc){


RECT rect;
int iAngle ;
POINT pt[3] ;
for (iAngle = 0 ; iAngle < 360 ; iAngle += 6){
pt[0].x = 0 ;
pt[0].y = 850 ;
RotatePoint (pt, 1, iAngle) ;
pt[2].x = pt[2].y = iAngle % 5 ? 25 : 0;
pt[0].x -= pt[2].x / 3 ;
pt[0].y -= pt[2].y / 3 ;
pt[1].x = pt[0].x + pt[2].x ;
pt[1].y = pt[0].y + pt[2].y ;
SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)) ;
Ellipse (hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y) ;
TextOut(hdc, 410, 790, "1", 1);
TextOut(hdc, 715, 490, "2", 1);
TextOut(hdc, 825, 60, "3", 1);
TextOut(hdc, 705, -365, "4", 1);
TextOut(hdc, 410, -680, "5", 1);
TextOut(hdc, -25, -790, "6", 1);
TextOut(hdc, -450, -685, "7", 1);
TextOut(hdc, -760, -360, "8", 1);
TextOut(hdc, -875, 60, "9", 1);
TextOut(hdc, -785, 480, "10", 2);

3
TextOut(hdc, -470, 790, "11", 2);
TextOut(hdc, -50, 910, "12", 2);
}
}

void DrawHands (HDC hdc, struct tm *datetime, BOOL bChange){

static POINT pt[3][5] = { 0, -50, 25, 0, 0, 500, -25, 0, 0, -50,


0, -50, 25, 0, 0, 700, -25, 0, 0, -50,
0, 0, 0, 0, 0, 0, 0, 0, 0, 800 };
int i, iAngle[3] ;
POINT ptTemp[3][5] ;
iAngle[0] = (datetime->tm_hour * 30) % 360 + datetime->tm_min / 2 ;
iAngle[1] = datetime->tm_min * 6 ;
iAngle[2] = datetime->tm_sec * 6 ;
memcpy (ptTemp, pt, sizeof (pt)) ;
for (i = bChange ? 0 : 2 ; i < 3 ; i++){
RotatePoint (ptTemp[i], 5, iAngle[i]) ;
Polyline (hdc, ptTemp[i], 5) ;

}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
HDC hDcMem;
HANDLE hOld;
PAINTSTRUCT ps;
HBITMAP hBmp[11];
static int cxClient, cyClient ;
static struct tm dtPrevious ;
BOOL bChange ;
HDC hdc ;
time_t lTime ;
struct tm *datetime ;
switch (msg) {

case WM_CREATE :
time (&lTime) ;
datetime = localtime (&lTime) ;
dtPrevious = * datetime ;
return 0 ;

case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_DESTROY:
KillTimer (hwnd, ID_TIMER) ;
PostQuitMessage(0);
break;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
nTime.LearnTime();
hDcMem = CreateCompatibleDC(hdc);
for (int i = 0; i < 8; i++) {
if(nTime.NumbTime[i] == 10) nTime.right -= 30;
hOld = SelectObject(hDcMem, nTime.hBmp[nTime.NumbTime[i]]);
BitBlt(hdc, nTime.left, nTime.top, nTime.right, nTime.bottom,
hDcMem, 0, 0, SRCCOPY);
4
SelectObject(hDcMem, hOld);
nTime.Invn();
}
SetIsotropic (hdc, cxClient, cyClient) ;
DrawClock (hdc) ;
DrawHands (hdc, &dtPrevious, TRUE) ;
DeleteObject(hDcMem);
EndPaint(hwnd, &ps);
break;

case WM_TIMER:
InvalidateRect(hwnd,NULL,TRUE);
time (&lTime) ;
datetime = localtime (&lTime) ;
bChange = datetime->tm_hour != dtPrevious.tm_hour || datetime-
>tm_min != dtPrevious.tm_min ;
hdc = GetDC (hwnd) ;
SetIsotropic (hdc, cxClient, cyClient) ;
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
DrawHands (hdc, &dtPrevious, bChange) ;
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
DrawHands (hdc, datetime, TRUE) ;
ReleaseDC (hwnd, hdc) ;
dtPrevious = *datetime ;
return 0 ;
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}

Rezultatele obtinute

Concluzii

5
În urma executării acestei lucrări de laborator am studiat metodele și principiile de lucru cu
timerul. Pentru a realiza sarcina propusă am creat un program ce preia datele legate de timp de la
sistemul operațional și generează un desen ce reprezintă un ceas analog și digital.

S-ar putea să vă placă și