Создание многопоточного приложения. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Создание многопоточного приложения.



В данном примере создается многопоточное приложение, выполняющее следующие действия:

Первичный поток открывает файл для записи и запускает еще два потока. Второй поток за предоставляемый квант времени увеличивает счетчик на 1. Третий поток за предоставляемый квант времени записывает очередное значение счетчика в файл. Первичный поток работает, пока значение счетчика не станет больше 30, после чего первичный поток завершает работу второго и третьего потоков.

1. Описание глобальных переменных, используемых всеми потоками. (Например, в блоке VAR в начале программы).

var

Form1: TForm1;

sum:Integer;

f:TextFile;

implementation …..

2. В начале программы следует описать второй и третий потоки.

implementation

 

{$R *.dfm}

procedure Thread1;

begin

While Sum<20 do

begin

Inc(Sum); Sleep(30);

end;

end;

 

procedure Thread2;

begin

While Sum <20 do

begin

Writeln(f,IntToStr(Sum)); Sleep(30);

end;

end;

 

3. Первичный поток имеет вид:

VAR hThread1,hThread2:THandle;

pFunc1,pFunc2:pointer;

ThreadID1,ThreadID2:CARDINAL;

begin

Sum:=0;

AssignFile(f,'C:\temp.txt'); Rewrite(f);

pFunc1:=@Thread1; pFunc2:=@Thread2;

hThread1:=CreateThread(nil,0,pFunc1,nil,0,ThreadID1);

hThread2:=CreateThread(nil,0,pFunc2,nil,0,ThreadID2);

While Sum<20 do Sleep(30);

ShowMessage ('Работа завершена');

CloseFile(f);

TerminateThread(hThread1,0); TerminateThread(hThread2,0);

end;

5.4. Задания для самостоятельной работы

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

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

3. Создание двух программ. Первая программа выводит на экран случайные числа. Вторая программа запускает первую как процесс и завершает работу первой программы при нажатии управляющей клавиши.

4. Программа выводит на экран содержимое каталога. При выборе любого файла последний запускается на выполнение при помощи функции CreateProcess (при условии, что выбран исполняемый файл).

5. Программа выводит на экран содержимое каталога. При выборе любого текстового файла при помощи функции CreateProcess запускается блокнот или редактор Write и открывается выбранный файл.

6. Создание многопоточной программы. Вторичный поток создается при нажатии управляющей клавиши и выводит на экран последовательность четных чисел. Работа вторичного потока завершается при нажатии управляющей клавиши.

7. Создание программы, имеющей три потока. Каждый поток рисует в своем окне соответственно эллипс, прямоугольник и текстовую строку.

8. Создание программы, имеющей несколько потоков. Вторичные потоки создаются и завершаются по команде пользователя. Первичный поток выводит на экран время создания, завершения и работы каждого вторичного потока.

9. Создание программы, имеющей два потока. Вторичный поток выполняет любые циклические вычисления и завершается по команде пользователя. Первичный поток выводит на экран промежуточные результаты вычислений, выполняемых вторичным потоком.

10. Создание многопоточной программы. Первичный поток считывает из текстового файла в буфер очередную порцию данных, вторичный поток подсчитывает число символов латинского алфавита в буфере. Затем первичный поток считывает следующую порцию данных в буфер и т.д.

11. Создание двух приложений. Первое приложение запускает второе приложение и прекращает его работу через определенный интервал времени (временной интервал указывается). Второе приложение выполняет вычисления по формуле 1 – x2/ 2! + x4/4! + …+ (-1)n x2n/(2n)! и записывает все промежуточные результаты вычислений в файл. После завершение работы второго приложения, первое выводит итоговое значение.

12. Создание двух приложений. Первое приложение запускает второе приложение и проверяет, когда работа второго приложения будет завершена. Второе приложение вводит значения переменной х и формулу, по которой рассчитывается функция f(x), данные записываются в файл. Первое приложение после завершения второго приложения строит график функции f(x).

13. Создание двух приложений. Первое приложение запускает второе приложение и проверяет, когда работа второго приложения будет завершена. Второе приложение записывает в файл текст. Первое приложение после завершения второго приложения подсчитывает число строк в тексте.

14. Создание нескольких приложений. Одно из них рисует окружности, другое эллипсы, третье прямоугольники. Четвертое приложение запускает три предыдущих и завершает работу любого.

15. Создание нескольких приложений. Одно из них рисует окружности, другое эллипсы, третье прямоугольники. Четвертое приложение запускает три предыдущих и изменяет приоритет любого процесса.

16. Создание многопоточной программы. Первый поток вводит некоторую формулу, второй поток проверяет правильность расстановки скобок в формуле.

17. Создание многопоточной программы. Первый поток вводит некоторый текст, второй поток подсчитывает количество предложений в тексте.

18. Создание двух приложений. Первое приложение записывает в файл содержимое выбранного каталога и завершает свою работу. Второе приложение ожидает, когда завершится работа первого приложения и выводит на экран содержимое каталога.

19. Создание двух приложений. Первое приложение записывает любой текст в файл, проецируемый в память, и завершает свою работу. Второе приложение ожидает завершения работы первого приложения и подсчитывает число слов в данном файле, проецируемом в память.

20. Создание двух приложений. Первое приложение записывает любой текст в файл, проецируемый в память, и завершает свою работу. Второе приложение ожидает завершения работы первого приложения и удаляет все пробелы из данного файла.

 

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

1. Сравните возможности функций CreateProcess? WinExec и ShellExecute

2. В чем заключается различие между процедурой ExitProcess и функцией TerminateProcess?

3. Почему ExitProcess и ExitThread реализованы как процедуры, TerminateProcess и TerminateThread – как функции?

4. Как установит приоритет текущего процесса равным 31?

5. Как установит приоритет текущего процесса равным 1?

6. Величина кванта потока - 6 квантовых единиц. Компьютер имеет несколько процессоров. Определите величину кванта в миллисекундах.

7. Величина кванта потока - 18 квантовых единиц. Компьютер имеет один процессор. Определите величину кванта в миллисекундах.

8. Вы начали длительный пересчет электронной таблицы и переключились на приложение, активно использующее процессор (например, игра типа “action”). Что сделает ОС для эффективного использования процессорного времени – увеличит приоритет активного процесса (игры) или увеличит квант времени активного процесса. Ответ обоснуйте.

9. Поток ожидал завершения операции ввода-вывода. Текущий приоритет потока – 12. По завершении операции ввода-вывода приоритет потока должен быть увеличен на 4 уровня. Каким будет приоритет потока после завершения операции ввода-вывода?

 

ЛАБОРАТОРНАЯ РАБОТА № 6

РАБОТА С ФУНКЦИЯМИ TOOLHELP

Цель работы

Целью работы является получение навыков работы с функциями библиотеки ToolHelp API для получения системной информации. В данной работе рассматриваются следующие вопросы:

· Получение списка всех процессов в системе;

· Получение списка всех модулей в системе;

· Получение списка всех потоков выбранного процесса;

· Получение карты памяти выбранного процесса.

Теоретическое введение

При разработке программного обеспечения часто возникает задача получения системной информации, например, списка всех загруженных процессов или списка созданных потоков. В Windows первоначально отсутствовали средства для получения данной информации. Однако, начиная с Windows 95, в состав операционной системы включен набор функций, позволяющих получать системную информацию. Данные функции включены в ToolHelp API. В Delphi функции ToolHelp API описаны в файле TlHelp32.pas.

Функции ToolHelp можно условно разбить на следующие функциональные группы:

· Получение «мгновенного снимка» системы;

· Информация о процессах;

· Информация о потоках;

· Информация о кучах (heap);

· Информация о виртуальной памяти;

· Информация о модулях.



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 539; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.144.32 (0.032 с.)