- •ПРОЦЕСС И ПОТОК
- ••Процесс - экземпляр выполняемого приложения. При запуске приложения происходит выделение памяти под процесс,
- ••Каждый поток может создать другой поток и т.д.
- ••В 32-х разрядных версиях Windows используется вытесняющая многозадачность
- •Класс – TThread
- •Запустить поток
- •Пример
- •Назовем свой поток tnew
- ••У объекта есть только одна процедура Execute. В любых потоках эта процедура обязана
- ••procedure TCountObj.Execute;
- •Переменную index объявим как integer в разделе private объекта потока. Там же объявим
- ••подключаем главную форму в раздел uses. В методе Execute запускается цикл while, который
- •офункции Synchronize.
- •Главная программа
- ••В разделе private объявляем переменную co типа Ttnew (объект нашего потока). По нажатию
- •возможности потоков
- ••Suspended - если этот параметр true, то поток находится в паузе.
- •сообщение SendMessage
- •сообщение SendMessage
- ••const
- •Критические секции
- ••У TCriticalSection есть два нужных нам метода, Enter и Leave, соответственно вход и
ПРОЦЕСС И ПОТОК
•Процесс - экземпляр выполняемого приложения. При запуске приложения происходит выделение памяти под процесс, в часть которой и загружается код программы.
•Поток - объект внутри процесса, отвечающий за выполнение кода и получающий для этого процессорное время.
•Каждый поток может создать другой поток и т.д.
•Каждый процесс имеет свой уникальный идентификатор – целое число, назначаемое операционной системой при создании процесса.
•Потоки не могут существовать отдельно от процесса, т.е. каждый поток принадлежит какому-то процессу и этот поток выполняет код, только в адресном пространстве этого процесса.
•Поток не может выполнить код чужого процесса.
•В 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;