Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Краткие теоретические сведения. 1. 1 функции Win32 для создания и управления процессами

 

1.1 Функции Win32 для создания и управления процессами

Процесс (Process) в ОС Windows владеет 4 Гб адресным пространством, базовым приоритетом, потоками, модулями, открытыми файлами и другими ресурсами. Процесс описывается идентификатором процесса и описателем (Handle). В момент создания процесс получает в собственное владение единственный программный поток (Thread), который исполняется и может создавать другие потоки.

Для запуска приложения необходимо создать новый процесс. Для этого можно использовать три функции Win32:

- WinExec ('путь\имя_приложения параметры_командной_строки', 1) - запуск в развернутом окне

- CreateProcess () – создание процесса

Фрагмент кода для создания процесса с использованием функции CreateProcess:

Var lpStartupInfo: TStartupInfo;

lpProcessinformation: TprocessInformation;

begin

if opendialog1.Execute

then

begin

FillChar (lpStartupInfo, Sizeof (lpStartupInfo),#0);

lpStartupInfo.cb:=sizeof (lpStartupInfo);

lpStartupInfo.dwFlags:=STARTF_USESHOWWINDOW;

lpStartupInfo.wShowWindow:=SW_SHOWNORMAL;

if not CreateProcess (

pchar(opendialog1.filename),

nil,

nil,

nil,

false,

NORMAL_PRIORITY_CLASS,

nil,

nil,

lpStartupInfo,

lpProcessInformation)

then

ShowMessage (inttostr(GetLastError))

else

begin

WaitForSingleObject (lpProcessInformation.hProcess,100);

CloseHandle (lpProcessInformation.hProcess);

end;

- ExecuteFile () из модуля fmxutils (в каталоге Delphi) или функции ShellExecute () Shell API.

Для завершения процесса используются функции ExitProcess () и TerminateProcess ().

Для управления выполнением процесса используются 2 функции:

- GetCurrentProcess () - получение описателя текущего процесса

- SetPriorityClass () - изменение класса приоритета процесса

BOOL SetPriorityClass (HANDLE hProcess, // описатель процесса

DWORD dwPriorityClass // значение класса приоритета процесса

);

Параметр dwPriorityClass может принимать ТОЛЬКО значения, перечисленные ниже.

· HIGH_PRIORITY_CLASS Для процесса, выполняющего критичные по времени задачи

· IDLE_PRIORITY_CLASS Для процесса, потоки которого должны выполняться, когда нет более приоритетных задач – например, хранитель экрана.

· NORMAL_PRIORITY_CLASS Для большинства процессов (значение по умолчанию).

· REALTIME_PRIORITY_CLASS Наибольшее возможное значение приоритета.

Возвращаемые значения. При успешном выполнении возвращает ненулевое значение.

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

 

1.2 Функции Win32 для создания и управления потоками

 

Поток или Thread – это фрагмент кода приложения. Поток имеет описатель (Handle), приоритет, идентификатор, стек.

Для создания потока служит функция CreateThread (). Прототип функции имеет вид:

CreateThread (

LpThreadAttributes: LPSECURITY_ATTRIBUTES, // указатель на атрибуты безопасности

dwStackSize: DWORD, // начальный размер стека

lpStartAddress: LPTHREAD_START_ROUTINE, // адрес функции потока

lpPar: LPVOID, // указатель на блок параметров

dwCreationFlags: DWORD, // параметры создания потока

lpThreadId: LPDWORD // идентификатор созданного потока

): Handle;

Первый параметр определяет адрес структуры SECURITY_ATTRIBUTES, задающей атрибуты защиты создаваемого потока. Во многих случаях используются стандартные атрибуты защиты, и первый параметр имеет значение nil.

Второй параметр задает начальный размер стека потока. Указанное значение округляется до размера страницы. Если параметр равен нулю, используется размер стека по умолчанию 1 Мб.

Третий параметр записывается в виде @ThreadFunction, где ThreadFunction – имя функции потока.

Если функция потока не имеет параметров, четвертый параметр должен иметь значение nil.

Если параметр dwCreationFlags равен нулю, созданный поток сразу начинает выполняться. Если указанный параметр равен CREATE_SUSPENDED, созданный поток должен быть запущен функцией ResumeThread().

При успешном завершении функция возвращает описатель (Handle) cозданного потока.

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

Handle:= CreateThread (nil, 0, @ThrFn, nil, 0, Tid);

В приведенном примере созданный поток имеет стек размером по умолчанию 1М, функция потока function ThrFn (p:pointer): longint; stdcall; не получает параметров. Функция потока должна быть определена в программе в разделе implementation до вызова функции CreateThread ().

В приведенном примере созданный поток сразу начнет выполняться и завершится после выполнения оператора return () функции ThrFn (). Если оператор return () отсутствует, поток завершится при достижении точки выхода функции ThrFn ().

Например, в программе определена функция потока

function ThrFn (p:pointer): longint; stdcall;

var k, m: integer;

begin

m:= 0;

for k:=1 to 50 do m:= m+1;

end;

Созданный поток с функцией ThrFn существует несколько Мсек и практически не виден в диспетчере задач. Чтобы увидеть с помощью диспетчера задач созданные потоки, можно использовать различные способы:

· цикл while true do – такой цикл, содержащий операторы присваивания, создает 50 или 100% загрузку CPU;

· вызов функции приостановки выполнения потока SuspendThread (handle);

· вызов функции Sleep (время_задержки).

Функция SuspendThread (handle) выполняет приостановку выполнения потока, заданного своим описателем Handle. Для продолжения выполнения приостановленного потока (активации) служит функция ResumeThread (handle).

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

Sleep (cMilliseconds: Dword); // время приостановки указывается в миллисекундах

Если указано нулевое значение интервала, поток, вызвавший функцию Sleep() отдает остаток своего кванта времени другому потоку.

 

Завершение выполнения потока

Для завершения потока используются функции ExitThread (Handle) и TerminateThread (Handle). Функция ExitThread () используется для обычного (штатного) завершения потока, функция TerminateThread () завершает поток аварийно, без закрытия (освобождения) принадлежащих ему ресурсов.

 

Изменение приоритета потока

Для управления приоритетом потока используются функции

GetCurrentThread () – получение описателя текущего потока

SetThreadPriority (Handle, nPriority) - установка относительного приоритета потока в пределах процесса. Первый параметр определяет поток, приоритет которого необходимо изменить. Для текущего потока следует использовать функцию GetCurrentThread() без параметров. Второй параметр задает приоритет потока относительно базового класса приоритета процесса, которому принадлежит поток. Второй параметр может принимать одно из 7 значений, перечисленных ниже. Другие значения, в том числе и числовые значения, использовать нельзя.

Допустимые значения второго параметра функции SetThreadPriority() в порядке убывания:

· THREAD_PRIORIRY_TIME_CRITICAL;

· THREAD_PRIORIRY_HIGHEST;

· THREAD_PRIORIRY_ABOVE_NORMAL;

· THREAD_PRIORIRY_NORMAL;

· THREAD_PRIORIRY_BELOW_NORMAL;

· THREAD_PRIORIRY_LOWEST;

· THREAD_PRIORIRY_IDLE.

В общем случае изменение приоритета потока выполняется в два этапа: задание базового класса приоритета процесса, которому принадлежит поток и задание приоритета потока.

Более подробную информацию о параметрах функций необходимо искать в файлах Win32.hlp и Windows.pas.

 

2. МЕТОДИКА ВЫПОЛНЕНИЯ

 

1. Построить приложение для запуска приложения, путь, имя которого и дополнительные параметры можно задавать в диалоговом окне. Для запуска приложения использовать функции WinExec(), ExecuteFile() и CreateProcess – см. таблицу 1 индивидуальных заданий для бригад.

Таблица 1 индивидуальных заданий

 

Номера бригад Используемые функции для запуска приложений
  CreateProcess(), задавать параметр командной строки
  CreateProcess(), задавать базовый класс процесса
  CreateProcess(), задавать размер окна
  CreateProcess(), задавать базовый класс процесса
  ExecuteFile()
  WinExec()
7, 8 WinExec()
9, 10 ExecuteFile()

 

2. Экспериментально определить максимальное количество потоков, которое может создать процесс. Параметры процесса определять с помощью диспетчера задач.

3. Построить приложение для управления выполнением потоков процесса с помощью рассмотренных в работе функций Win32 API – таблица 2

Таблица 2 индивидуальных заданий

 

Номера бригад Используемые функции для запуска приложений
1, 2 Создать 2 потока, предусмотреть возможность изменения создаваемой потоками загрузки CPU в пределах от 10% до 70% через 30%
3, 4 Создать 2 потока, предусмотреть возможность изменения создаваемой потоками загрузки CPU в пределах от 0% до 90% через 30%
5, 6 Создать 2 потока, суммарно загружающих процессор на 50%
7, 8,9,10 Создать 2 потока, загружающих процессор на 100%. Предусмотреть кнопку для приостановки выполнения этих потоков и продолжения их работы.

 

Примечания.

1. Результаты работы контролировать с помощью диспетчера задач (количество потоков процесса, уровень загрузки ядер CPU, количество созданных дескрипторов процесса.

2. Для бригад 1-6 проанализировать факторы, влияющие на стабильность создаваемой загрузки и величину колебаний загрузки. Проверить влияние приоритета потоков на уровень колебаний создаваемой загрузки CPU.

 

3. ОТЧЕТ О РАБОТЕ

 

1. Тексты приложений, разработанных в п.1, 2 и 3. Описание метода и алгоритма выполнения задания п. 3.

2. Экспериментально найденное максимальное значение количества потоков процесса.

3. Экспериментально найденные зависимости колебаний создаваемой загрузки от величины загрузки и приоритета потоков в виде таблицы.

 

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

 

1. Функции Win32, используемые для создания процессов, их достоинства и недостатки.

2. Функция Shell API для создания процесса, ее отличие от функций Win32 аналогичного назначения.

3. Функция ExecuteFile для создания процессов, ее отличия от функций Win32 аналогичного назначения.

4. Функции Win32, используемые для управления выполнением процессов

5. Функции Win32, используемые для завершения процессов.

6. Функции Win32, используемые для создания и завершения потоков.

7. Функции Win32, используемые для приостановки и возобновления выполнения потока.

8. Функция Sleep(), ее назначение и использование.

9. Функции Win32, используемые для управления приоритетом потока.

10. Факторы, влияющие на загрузку процессора потоками процесса и ее стабильность.

 

 

РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА

 

1. Джеффри Рихтер. Windows для профессионалов. – Спб., Питер, 2001.

2. Дарахвелидзе П. и др. Программирование в Delphi 7. Спб. 2004.

2.

<== предыдущая лекция | следующая лекция ==>
Плитка двукратного обжига | 
Поделиться с друзьями:


Дата добавления: 2015-05-10; Просмотров: 595; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.