Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР СПО(231000)(ПР инж) 12.docx
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
156 Кб
Скачать
☆

Процессы и потоки в Windows

1. Цель работы

Получить представление о принципах организации процессов и потоков в ОС Windows

  1. Краткие теоретические сведения

Процессы

Процесс – объект ядра, которому принадлежат системные ресурсы, используемые исполняемым приложением. Выполнение процесса начинается с первичного потока. Во время своего исполнения процесс может создавать другие потоки.

Исполнение процесса заканчивается при завершении всех его потоков.

Пример. Создание дочернего процесса

Дочерний процесс

#include <conio.h>

int main(int argc, char *argv[])

{

int i;

_cputs("I am created.");

_cputs("\nMy name is: ");

_cputs(argv[0]);

for (i = 1; i < argc; ++i)

_cprintf ("\n My %d parameter = %s", i, argv[i]);

_cputs("\nPress any key to finish.\n");

_getch();

return 0;

}

Родительский процесс

#include <windows.h>

#include <conio.h>

int main()

{

char lpszAppName[] = "ConsoleProcess.exe";

STARTUPINFO si;

PROCESS_INFORMATION piApp;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

// создаем новый консольный процесс

if (!CreateProcess(lpszAppName, NULL, NULL, NULL, FALSE,

CREATE_NEW_CONSOLE, NULL, NULL, &si, &piApp))

{

_cputs("The new process is not created.\n");

_cputs("Check a name of the process.\n");

_cputs("Press any key to finish.\n");

_getch();

return 0;

}

_cputs("The new process is created.\n");

// ждем завершения созданного процесса

WaitForSingleObject(piApp.hProcess, INFINITE);

// закрываем дескрипторы этого процесса в текущем процессе

CloseHandle(piApp.hThread);

CloseHandle(piApp.hProcess);

return 0;

}

Потоки

Поток – последовательность инструкций программы, выполняемая процессором.

Потоком в Windows называется объект ядра, которому операционная система выделяет процессорное время для выполнения приложения.

Программа называется многопоточной, если в ней может одновременно существовать несколько потоков.

Пример. Создание потока

#include <windows.h>

#include <iostream.h>

volatile int n;

DWORD WINAPI Add(LPVOID iNum)

{

cout << "Thread is started." << endl;

n += (int)iNum;

cout << "Thread is finished." << endl;

return 0;

}

int main()

{

int inc = 10; HANDLE hThread; DWORD IDThread;

cout << "n = " << n << endl;

// запускаем поток Add

hThread = CreateThread(NULL, 0, Add, (void*)inc, 0, &IDThread);

if (hThread == NULL)

return GetLastError();

// ждем, пока поток Add закончит работу

WaitForSingleObject(hThread, INFINITE);

// закрываем дескриптор потока Add

CloseHandle(hThread);

cout << "n = " << n << endl;

return 0;

}

Пример. Завершение потока

#include <windows.h>

#include <iostream.h>

volatile UINT count;

void thread()

{

for (;;)

{ ++count; Sleep(100); } // задержка

}

int main()

{

HANDLE hThread; DWORD IDThread; char c;

hThread =

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, &IDThread);

if (hThread == NULL)

return GetLastError();

for (;;)

{

cout << "Input 'y' to display the count or any char to finish: ";

cin >> c;

if (c == 'y') cout << "count = " << count << endl;

else break;

}

// прерываем выполнение потока thread

TerminateThread(hThread, 0);

// закрываем дескриптор потока

CloseHandle(hThread);

return 0;

}

3. Оборудование

4. Задание на работу

Спроектировать программу, использующую многопоточную структуру, по варианту, заданному пеподавателем.

5. Содержание отчета

6. Контрольные вопросы

Библиотеки динамической компоновки

1. Цель работы

Получить представление о принципах создания библиотек динамической компоновки.

2. Краткие теоретические сведения

Создание DLL-модуля

Для создания DLL-модуля в среде разработки Visual Studio необходимо выбрать проект типа Win32 DinamicLinkLibrary. DLL-модуль должен иметь главную функцию DllMain , которая является точкой входа.

Пример. Создание DLL-модуля

#include <windows.h>

// главная функция

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)

{

switch (dwReason)

{

case DLL_PROCESS_ATTACH: // загрузка DLL

break;

case DLL_THREAD_ATTACH: // создание потока

break;

case DLL_THREAD_DETACH: // завершение потока

break;

case DLL_PROCESS_DETACH: // отключение DLL

break;

}

return TRUE;

}

extern "C" __declspec(dllexport) int count = 0;

extern "C" __declspec(dllexport) int Add(int n)

{ count += n; return count;}

extern "C" __declspec(dllexport) int Sub(int n)

{ count -= n; return count;}

Оформление функций и переменных, которые могут использоваться клиентами.

В примере приведены определение переменной count и две функции

int Add(int n) и int Sub(int n).

Пример. Использование функций DLL-модуля

#include <windows.h>

#include <iostream.h>

int main()

{

HMODULE hDll; // дескриптор DLL

int (*Add)(int); // для адреса функции Add из DLL

int (*Sub)(int); // для адреса функции Sub из DLL

int *pCount; // для адреса переменной count из DLL

// загружаем динамически подключаемую библиотеку

hDll = LoadLibrary("Count.dll");

if (!hDll)

{ cerr << "Load library failed." << endl; return GetLastError(); }

// настраиваем адрес переменной count из DLL

pCount = (int *)GetProcAddress(hDll, "count");

if (!pCount)

{ cerr << "Get variable address failed." << endl; return GetLastError(); }

// выводим начальное значение переменной count

cout << "Initial count = " << (*pCount) << endl;

// настраиваем адреса функций

Add = (int (*)(int))GetProcAddress(hDll, "Add");

Sub = (int (*)(int))GetProcAddress(hDll, "Sub");

if (!Add || !Sub)

{ cerr << "Get procedure address failed." << endl; return GetLastError(); }

// изменяем значение счетчика

cout << "count = " << Add(20) << endl;

cout << "count = " << Sub(15) << endl;

// отключаем библиотеку

if (!FreeLibrary(hDll))

{ cerr << "Free library failed." << endl; return GetLastError(); }

// выходим из программы

cout << "Press any key to exit.";

cin.get();

return 0;

}

3. Оборудование

4. Задание на работу

Создать и протестировать работу Dll­-модуля по варианту, заданному преподавателем.

6. Контрольные вопросы

Программирование сервисов

1. Цель работы

Получить представление о принципах создания и использования сервисов.

2. Краткие теоретические сведения

Концепция сервиса

Сервис – процесс, который выполняет служебные функции.

Сервис запускается при загрузке операционной системы или по специальной команде.

Завершение работы сервиса осуществляется либо по специальной команде, либо при завершении работы ОС.

Пример сервиса – фоновый процесс для доступа к базе данный. Этот тип сервиса называется сервером.

Другой тип сервиса –программа доступа к внешним устройствам.

Монитор – сервис, который отслеживает работу приложения.

Управляет работой сервисов специальноая программа – менеджер сервисов.

Установка сервиса влечет изменение ключа реестра Services.