
- •Оглавление
- •1. Интерфейс графического устройства gdi. Обработка сообщений wm_paint.
- •2. Обмін інформацією між процесами та потоками. Обмін даними за допомогою файлів.
- •3.Створити програму у Windows (Win32 api), яка виводе одне (головне) вікно.
- •4. Обмін інформацією між процесами та потоками. Обмін повідомленнями.
- •5. Створити програму у Windows (Win32 api), яка демонструє основні стилі вікон (вікно верхнього рівня, спливаюче вікно з головним вікном та без нього, дочірнє вікно).
- •6. Процеси та потоки. Створення процесу. Створення потоку
- •7. Створити програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід текстових строк у вікно.
- •8) Створити програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід різноманітних типів ліній у вікно.
- •9. Робота з файлами. Асинхронні операції з файлами.
- •10. Створити простішу програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід простих геометричних фігур у вікно.
- •11. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень wm_paint, wm_destroy, wm_create, wm_command. Другі повідомлення передати на обробку стандартній функції вікна.
- •№ 12 Стандартні елементи керування. Графічний список. Індикатор прогресу. Складальний лічильник.
- •13. Створити простішу програму у Windows (Win32 api), яка забезпечує обробку повідомлень миші (wm_lbuttondown, wm_rbuttondown) у вікні.
- •15. Базові команди. Класифікація команд. Команди передачі даних. Команди обміну процесора з пам'яттю. Команди передачі кодів між процесором і периферією.
- •16. Команди обробки даних. Базові арифметичні команди.
- •17. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень клавіатури (wm_keyup, wm_keydown) у вікні.
- •18. ВікнаWindows.Процедура створенняд очірнього вікна. Повідомлення wm_create.
- •19. Створити програму у Windows (Win32 api), яка забезпечує роботу з таймером.
- •20.Таймери Windows і служба часу.
- •24. Інтерфейс графічних пристроїв gdi. Обробка повідомлень wm_paint.
- •26. Створити простішу програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - графічний список.
- •27. Основи розробки Windows-додатків. Головна функція WinMain(). Повідомлення Windows.
- •29 Створити програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - набірний лічильник.
6. Процеси та потоки. Створення процесу. Створення потоку
Процессом называют экземпляр выполняемой программы - не ход выполнения программы, а именно саму программу вместе с ее ресурсами. В понятие процесса включают виртуальное адресное пространство, коды и данные, принадлежащие программе, а также такие системные ресурсы, как файлы, синхронизирующие объекты, библиотеки динамического связывания и др. Таким образом, процесс в Win32, в противоречии со смыслом этого слова, не является динамическим объектом - это скорее оболочка, набор ресурсов, которые нужны для выполнения программы. Потоком называют ход выполнения программы. Поток выполняется в рамках владеющего им процесса или, как говорят, в контексте процесса. Именно потоку операционная система выделяет кванты процессорного времени. Поток выполняет программные коды, принадлежащие процессу. Когда операционная система запускает приложение, она создает первичный поток процесса, составляющего это приложение. Таким образом, любой процесс имеет по крайней мере один поток выполнения. Первичный поток может запустить дополнительные потоки, которые в программе оформляются как более или менее самостоятельные функции. Эти потоки будут выполняться параллельно, конкурируя за процессорное время. Довольно очевидно, чтовсе потоки процесса разделяют виртуальное адресное пространство процесса, его глобальные переменные (потому что они доступны всем функциям), а также ресурсы операционной системы, используемые процессом.
Создание процесса
Рассмотрим программу, которая запускает другую программу в качестве дочернего процесса. Чтобы подчеркнуть независимость процессов, сделаем обе программы по всем правилам, с главными окнами и циклами обработки сообщений. В программе родительского процесса предусмотрим еще линейку меню с пунктом "Запуск процесса". Назовем родительскую программу 12-1а, а дочернюю - 12-1Ь. Приведем сначала текст дочерней
программы, в которой, впрочем, нет ничего нового или интересного.
/•Программа 12-ХЪ. Дочерний процесс*/
/*Файл 12-1Ъ.Ь*/ ,
LRESULT CALLBACK WndProc (HWND, UINT,WPARAM, LPARAM) ;
voidOnPaint(HWND);
voidOnDestroy(HWND);
/*Файл 12-lb.cpp*/
#include <windows.h>
#include <windowsx.h>
•include "12-lb.h"
LRESULT CALLBACK WndProc (HWND, UINT , WPARAM, LPARAM ) ;
voidOnPaint(HWND)j
voidOnDestroy(HWND);
charszClassName[]="MainWindow";
charszTitle[]^"Программа 12-lb";
/*ГлавнаяфункцияWinMain*/
int WINAPI WinMain(HINSTANCE hlnst,HINSTANCE,LPSTR,int){
MSG Msg;
WNDCLASS we;
ZeroMemory(&wc,sizeof we);
we .lpfnWndProc=WndProc ,-
we.hlnstance=hlnst;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
we.hCursor=LoadCursor(NULL,IDC_ARROW);
we.hbrBackground=GetStockBrush(LTGRAY_BRUSH);//Светло-серыйцветокна
we.lpszClassName=szClassName;
RegisterClass(&wc);
HWND hwnd=CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,
100,300,310,100,HWND_DESKTOP,NULL,hlnst,NULL);
ShowWindow (hwnd, SW_NORMAL) ;
while(GetMessage(&Msg,NULL,0,0))
DispatchMessage(&Msg) ;
return 0;
}
/*0коннаяфункцияWndProcглавногоокна*/
LRESULT CALLBACK WndProc(HWND hwnd,UINTmsg.WPARAMwParam,LPARAMlParam){
switch(msg){
HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
default:
return(DefWindowProc(hwnd,msg,wParam,lParam));
}
}
/*функцияобработкисообщений WMPAINT*/
voidOnPaint(HWND hwnd){ I
PAINTSTRUCT ps;
charszText[]="Простое приложение для всяких испытаний";
HDC hdc=BeginPaint(hwnd,&ps);
SetBkMode(hdc,TRANSPARENT);
TextOut(hdc,5,30,szText,strlen(szText));
EndPaint(hwnd,&ps);
voidOnDestroy(HWND){
PostQuitMessage (0) ,•
Создание потока
Итак, процесс - это, в сущности, программа. Создание процесса обозначает запуск из
текущей программы другой, которую естественно назвать дочерней. Рассмотрим теперь
создание в рамках текущего процесса порожденного потока. Как уже отмечалось, систе-
ма, запуская приложение, организует в нем первичный поток выполнения. Этот поток
может с помощью функции CreateThread() создать еще один или несколько потоков, ко-
торые будут выполняться параллельно в контексте владеющего ими процесса (запущен-
ной программы). С формальной точки зрения каждый поток представляет собой одну из
функций, входящих в состав всего процесса; в отличие от остальных эту функцию можно
назвать функцией потока или рабочей функцией. Однако организационно потоки могут
принимать самые разные формы.
В простейшем случае каждый поток представляет собой просто подпрограмму, кото-
рая выполняет некоторую вычислительную работу, например решает свою систему урав-
нений. Получаемые ими результаты потоки могут сохранять в общей памяти процесса
или выводить в окно процесса. Все системы уравнений, если их несколько, решаются па-
раллельно и в известной степени одновременно. При необходимости можно организовать
передачу данных из потока в поток (вспомним, что для всех потоков доступны все гло-
бальные переменные процесса) или синхронизировать выполнение потоков.
Другой способ организации потоков заключается в том, что каждому из них "выдает-
ся" свое окно и, соответственно, внутри каждого потока предусматривается свой цикл
обработки сообщений. В этом случае потоки ведут более самостоятельный образ жизни -
каждый из них может получать от пользователя предназначенные для него данные и вы-
водить в свое окно результаты работы. Следует подчеркнуть, что наличие у потока (не-
важно, первичного или вторичного, порожденного) окна требует также и организации
цикла обработки сообщений, по крайней мере с обработкой сообщения WM_PAINT
(иначе как можно что-то вывести в окно?) и, возможно, WM_COMMAND, чтобы вос-
принимать команды оператора, подаваемые через меню или элементы управления. Пото-
ки такого рода называют интерфейсными, так как каждый из них может независимо от
других взаимодействовать с пользователем, т. е. обладает собственным интерфейсом.