Efectul programului Programul pe care-l vom prezenta drept exemplu utilizeaza o fereastra. Fereastra are titlul "Exemplu Multithread Win32", asa cum se poate vedea din bara de titlu. Are un meniu pull-down numit "Program" care contine patru alternative: - Thread Nou - Termina Thread - Sterge - Exit Fiecare dintre alternative poate fi activata prin click de mouse sau prin tastarea literei subliniate. Continutul ferestrei consta din linii frânte de diferite culori. Fiecare nou thread traseaza o linie de o alta culoare. La startul unui thread se pleaca dintr-o pozitie fixa a cursorului, sub un anumit unghi variabil si se traseaza linia pe aceasta directie pâna la întâlnirea marginii ferestrei. De aici drumul liniei continua respectându-se legea reflexiei în oglinda. La oprirea unui thread linia lui nu mai este desenata. Stergerea curata interiorul ferestrei, ramânand pe ecran doar desenarile de dupa momentul stergerii. Pentru elaborarea acestui program proiectantul trebuie sa creeze patru fisiere: Un fisier binar continând imaginea iconului; Un fisier text, pe post de header, care contine denumirile codificate ale resurselor folosite; Un fisier text în care sunt descrise resursele folosite; Un program C sau C++ care descrie functionarea programului. Fisierul Icon1.ico Fisierul Icon1.ico, creat cu un editor specializat de iconuri, de exemplu cu ResourceWorkShop sau cu SdkPaint, contine, pentru acest program, imaginea iconului. Aceasta imagine se vede în permanenta în coltul din stânga sus a ferestrei. De asemenea, în caz de minimizare, pe bara de taskuri (partea de jos a ecranului) apare acelasi icon urmat de textul: Exemplu Mul . . . Fisierul Resource.h Fisierul Resource.h are menirea de a atribui nume simbolice resurselor nou definite. In acest exemplu sunt introduse cinci astfel de resurse: crearea unui nou thread (ID_NEW), terminarea activitatii unui nou thread (ID_END), terminarea activitatii programului (ID_QUIT), stergerea continutului ferestrei (ID_CLEAR) si reperarea resursei icon (IDI_ICON1). Astfel de resurse trebuie de fapt codificate cu numere întregi, distincte si cu valoarea cel putin 100. Codificarile sunt folosite atât în fisierul de resurse (Res.rc) cât si în programul propriu-zis (winnt.cpp). Analizând continutul celor doua fisiere se poate observa ca fiecare resursa apare exact odata în fiecare dintre fisiere. Programatorul se poate lipsi de acest fisier daca scrie, în cele doua fisiere, numerele 1006, 1007, 1008, 1009 si 100 în locul numelor lor simbolice (evident, eliminând si cele doua #include "Resource.h"). Practica programarii arata însa ca este mai potrivita atribuirea de nume simbolice si operarea cu acestea. Fisierul Res.rc Fisierul Res.rc defineste resursele folosite. El poate fi obtinut fie manual de catre programator, fie prin intermediul unui editor special de resurse. Mai întâi se specifica legatura dintre numele simbolic al iconului cu fisierul icon1.ico în care se afla imaginea iconului. Apoi este descris meniul. Se specifica ca este vorba de un meniu pop-up cu numele Program. Celor patru alternative ale meniului le sunt atribuite numele, li se asociaza numele simbolice (numerele) resurselor si li se specifica literele cu care pot fi activate de la tastatura. In numele din meniuri, literele prin care se pot activa alternativele de la tastatura sunt precedate de simbolul &. Programul winnt.cpp Programul propriu-zis este scris în C (C++) si este prezentat in fisierul winnt.cpp. Aceasta aplicatie poate fi executata, spre exemplu, folosind un mediu din categoria DevStudio. Mai întâi sunt definite stringurile care dau numele aplicatiei, clasei si titlului ferestrei. Se continua cu patru întregi si sase handles necesari în program. Apoi se definesc doua tablouri: primul fixeaza culorile cu care deseneaza fiecare thread, iar al doilea detine informatii de context pentru fiecare thread activ. Informatiile de context ale threadului sunt: handle-ul threadului, handle-ul care receptioneaza evenimentele, identificatorul de thread si indexul în tabela de culori cu care deseneaza threadul. Succesiunea prezentarilor de functii este bottom-up. Mai întâi se prezinta functia Deseneaza, care traseaza de la un punct primit la intrare la punctul vecin. FunctieThread dirijeaza activitatea unui thread. Dupa fixarea punctului initial si a incrementelor pe cele doua directii, într-un ciclu infinit, în cazul în care threadul este valid, deseneaza portiuni de câte un pixel, realizând si oglindirea la atingerea unei margini a ferestrei. In functia fereastra WndProc sunt prevazute interceptarea mai multor evenimente. Fara a intra în detalii (elementele teoretice prezentate la procese si threaduri NT, comentariile din program, cunostintele de limbaj C si putin efort prin helpuri suplinesc ...), enumeram aceste evenimente. - Crearea ferestrei, care include crearea unui "creion". - Evenimentul de redimensionare. - Desenarea ferestrei. - Inchiderea aplicatiei, care include eliberarea contextelor si anuntarea tuturor threadurilor active ca trebuie sa-si termine activitatea. * suita de actiuni provocata de deschiderea de catre utilizator a meniului pull-down si alegerea unei alternative. Trebuie remarcata aici cautarea unui thread inactiv, crearea lui si lansarea lui în executie. La crearea unui thread se specifica faptul ca dirijarea activitatii lui este facuta de catre functia FunctieThread. La cererea de terminare a unui task îl dezactiveaza pe primul, iar la stergerea ferestrei pur si simplu umple întregul spatiu cu culoarea pensulei. Functiile InitApplication si InitInstance înregistreaza si creaza fereastra. In sfârsit, este prezentata functia WinMain, care are forma clasica.