Разделы презентаций


ПРОЦЕСС И ПОТОК

Содержание

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

Слайды и текст этой презентации

Слайд 1ПРОЦЕСС И ПОТОК

ПРОЦЕСС И ПОТОК

Слайд 2Процесс - экземпляр выполняемого приложения. При запуске приложения происходит выделение

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



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

Слайд 3Каждый поток может создать другой поток и т.д.
Каждый процесс

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

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

Слайд 4В 32-х разрядных версиях Windows используется вытесняющая многозадачность
ОС разделяет

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

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

Слайд 5Класс – TThread

tnew = class(tthread) private { private declarations } protected procedure execute;

override; end; … procedure tnew.execute; begin { place thread code here } // Код, который будет

выполняться в отдельном потоке end;
Класс – TThread tnew = class(tthread) private { private declarations } protected procedure execute; override; end; …

Слайд 6Запустить поток
var new: tnew; … begin new := tnew.create(true); end;  
Значение true в методе create

значит, что после создания класса поток автоматически запущен не будет.


Запустить поток var new: tnew; … begin new := tnew.create(true); end;  Значение true в методе create значит,

Слайд 7Пример
Теперь создадим модуль для потока. Для этого выберем пункт меню

File->New->Other для открытия окна создания нового модуля найдём в этом

окне на закладке New пункт Thread Object.
ПримерТеперь создадим модуль для потока. Для этого выберем пункт меню File->New->Other для открытия окна создания нового модуля

Слайд 8Назовем свой поток tnew
Код созданного для потока модуля:
unit MyThread;
interface
uses
Classes;
type
T tnew

= class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ Important: Methods and

properties of objects in VCL can only be used in a
method called using Synchronize, for example,}
Synchronize(UpdateCaption);
procedure Ttnew.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TCountObj }
procedure TCountObj.Execute;
begin
{ Place thread code here }
end;
end.
Назовем свой поток tnew Код созданного для потока модуля:unit MyThread;interfaceusesClasses;typeT tnew = class(TThread)private{ Private declarations }protectedprocedure Execute;

Слайд 9У объекта есть только одна процедура Execute. В любых потоках

эта процедура обязана быть переопределена, и в ней должен быть

написан собственный код. Это связано с тем, что в объекте TThread, эта процедура объявлена как абстрактная (abstract) – пустая. Это значит, что процедуре дали имя, выделили место, но её код должен быть написан объектами потомками. Метод Execute – это и есть заготовка для кода потока. То, что написано здесь будет выполняться параллельно основной задаче.
У объекта есть только одна процедура Execute. В любых потоках эта процедура обязана быть переопределена, и в

Слайд 10procedure TCountObj.Execute;
begin
index:=1;
//Запускаем бесконечный счётчик
while index>0 do
begin
Synchronize(UpdateLabel);
Inc(index);
if index>100000 then
index:=0;
//Если поток остановлен,

то выйти.
if terminated then exit;
end;
end;

procedure TCountObj.Execute;beginindex:=1;//Запускаем бесконечный счётчикwhile index>0 dobeginSynchronize(UpdateLabel);Inc(index);if index>100000 thenindex:=0;//Если поток остановлен, то выйти.if terminated then exit;end;end;

Слайд 11Переменную index объявим как integer в разделе private объекта потока.

Там же объявим процедуру UpdateLabel. Эта процедура выглядит так:
procedure TCountObj.UpdateLabel;
begin
Form1.Label1.Caption:=IntToStr(Index);
end;

Переменную index объявим как integer в разделе private объекта потока. Там же объявим процедуру UpdateLabel. Эта процедура

Слайд 12
подключаем главную форму в раздел uses. В методе Execute запускается

цикл while, который будет выполняться, пока переменная index больше нуля.

Внутри цикла вызывается метод Synchronize увеличивается переменная index.
подключаем главную форму в раздел uses. В методе Execute запускается цикл while, который будет выполняться, пока переменная

Слайд 13о функции Synchronize.
Если процедура вызвана в методе Synchronize, то

выполнение основной программы и потока замораживается и к компонентам окна

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

Слайд 14Главная программа
В раздел uses главной формы (самый первый, который идёт

после interface) добавяемл модуль потока MyThread. Это связано с тем,

что в разделе private нужно объявить переменную имеющую тип нашего объекта. Если добавить имя модуля во второй раздел uses, то он находиться ниже той части кода, где нужно написать объявление. Именно поэтому добавлять модуль MyThread нужно в первый раздел uses.
Главная программаВ раздел uses главной формы (самый первый, который идёт после interface) добавяемл модуль потока MyThread. Это

Слайд 15
В разделе private объявляем переменную co типа Ttnew (объект нашего

потока). По нажатию кнопки "Запустить" напишем такой код:
procedure TForm1.Button1Click(Sender: TObject);
begin
co:=Ttnew.Create(true);
co.Resume;
co.Priority:=tpLower;
end;

В разделе private объявляем переменную co типа Ttnew (объект нашего потока). По нажатию кнопки

Слайд 16возможности потоков
Suspend - приостанавливает поток. Для вызова нужно написать

co.Suspend. Чтобы возобновить работу с этой же точки нужно вызвать

Resume.
Priority- устанавливает приоритет потока. Например Priority:=tpIdle;
tpIdle - поток будет работать только когда процессор бездельничает.
tpLowest - самый слабый приоритет
tpLower - слабый приоритет
tpNormal - нормальный
tpHigher - высокий
tpHighest - самый высокий
tpTimeCritical - критичный.
возможности потоков Suspend - приостанавливает поток. Для вызова нужно написать co.Suspend. Чтобы возобновить работу с этой же

Слайд 17Suspended - если этот параметр true, то поток находится в

паузе.
Terminated - если true, то поток должен быть остановлен, иначе

поток должен продолжать работу.
Terminate – остановить выполнение потока.
FreeOnTerminate – если это свойство равно true, то по завершении выполнения процедуры Execute поток самоуничтожиться.

Suspended - если этот параметр true, то поток находится в паузе.Terminated - если true, то поток должен

Слайд 18сообщение SendMessage
Каждый раз, когда надо обновить содержимое текста мы

можем посылать окну сообщение SendMessage с указанием значения, которое надо

установить. Главное окно будет получать это сообщение и компонент сам изменит заголовок. В этом случае мы не обращаемся к главному окну из потока, а только отправляем сообщение.
сообщение SendMessage Каждый раз, когда надо обновить содержимое текста мы можем посылать окну сообщение SendMessage с указанием

Слайд 19сообщение SendMessage
SendMessage(Form1.Edit1.Handle, WM_SETTEXT, 0, Integer(PChar(IntToStr(index))));
в разделе uses нужно добавить два

модуля: windows (здесь объявлена сама функция) и messages (здесь находятся

все типы сообщений Windows).
сообщение SendMessageSendMessage(Form1.Edit1.Handle, WM_SETTEXT, 0, Integer(PChar(IntToStr(index))));в разделе uses нужно добавить два модуля: windows (здесь объявлена сама функция) и

Слайд 20const PROGRESS_POS = WM_USER+1; В объявление класса формы добавим новый метод, а

затем и его реализацию: TForm1 = class(TForm) Button1: TButton; ProgressBar1: TProgressBar; procedure Button1Click(Sender: TObject); private procedure

SetProgressPos(var Msg: TMessage); message PROGRESS_POS; public { Public declarations } end; ... procedure TForm1.SetProgressPos(var Msg: TMessage); begin ProgressBar1.Position:=Msg.LParam; end; Теперь мы немного изменим, можно сказать даже упростим, реализацию метода Execute нашего потока: procedure TNewThread.Execute; var i: integer; begin for i:=0 to 100 do begin sleep(50); SendMessage(Form1.Handle,PROGRESS_POS,0,i); end; end;
const PROGRESS_POS = WM_USER+1;  В объявление класса формы добавим новый метод, а затем и его реализацию:

Слайд 21TNewThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; var Form1: TForm1; implementation {$R *.dfm} {

TNewThread } procedure TNewThread.Execute; begin while true do {ничего не делаем}; end; procedure TForm1.Button1Click(Sender: TObject); var NewThread:

TNewThread; begin NewThread:=TNewThread.Create(true); NewThread.FreeOnTerminate:=true; NewThread.Priority:=tpLower; NewThread.Resume; end;
TNewThread = class(TThread) private { Private declarations } protected procedure Execute; override; end;   var Form1:

Слайд 22Критические секции
var Form1: TForm1; CriticalSection: TCriticalSection; ... procedure TForm1.FormCreate(Sender: TObject); begin CriticalSection:=TCriticalSection.Create; end;

Критические секцииvar Form1: TForm1; CriticalSection: TCriticalSection;  ...  procedure TForm1.FormCreate(Sender: TObject); begin CriticalSection:=TCriticalSection.Create; end;

Слайд 23У TCriticalSection есть два нужных нам метода, Enter и Leave,

соответственно вход и выход из неё. Поместим наш код в

критическую секцию: procedure TNewThread.Execute; var i: integer; begin CriticalSection.Enter; for i:=0 to 100 do begin sleep(50); SendMessage(Form1.Handle,PROGRESS_POS,0,i); end; CriticalSection.Leave; end;
У TCriticalSection есть два нужных нам метода, Enter и Leave, соответственно вход и выход из неё. Поместим

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика