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

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

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

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

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

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

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

Поток не может выполнить код чужого процесса.

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

ОС разделяет процессорное время между разными приложениями и потоками на основе вытеснения. Разделение происходит в основном благодаря приоритету потока.

Чем выше приоритет, тем больше процессорного времени выделяется этому потоку. Потоки с одинаковым приоритетом будут получать одинаковое количество процессорного времени.

Класс – TThread

tnew = class(tthread) private

{ private declarations }

protected

procedure execute; override; end;

procedure tnew.execute; begin

{ place thread code here }

// Код, который будет выполняться в отдельном

потоке

end;

Запустить поток

var

new: tnew;

begin

new := tnew.create(true); end;

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

Пример

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

создания нового модуля найдём в этом окне на закладке New пункт Thread Object.

Назовем свой поток 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.

У объекта есть только одна процедура Execute. В любых потоках эта процедура обязана быть переопределена, и в ней

должен быть написан собственный код. Это связано с тем, что в объекте TThread, эта

процедура объявлена как абстрактная (abstract) – пустая. Это значит, что процедуре дали имя, выделили место, но её код должен

быть написан объектами потомками. Метод Execute – это и есть заготовка для кода потока. То, что написано здесь будет выполняться параллельно основной задаче.

procedure 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;

Соседние файлы в папке Операционные системы презентации