Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.docx
Скачиваний:
8
Добавлен:
30.10.2018
Размер:
824.42 Кб
Скачать

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, чтобы вос-

принимать команды оператора, подаваемые через меню или элементы управления. Пото-

ки такого рода называют интерфейсными, так как каждый из них может независимо от

других взаимодействовать с пользователем, т. е. обладает собственным интерфейсом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]