Приоритеты потоков
Значение относительного приоритета |
Приоритет |
Числовое значение |
TpIdle |
Данный поток выполняется, когда система не занята и не выполняются никакие другие потоки. Windows не будет прекращать работу других потоков для выполнения потока, имеющего приоритет tpldle |
-15 |
TpLowest |
Низший приоритет выполнения. Данный поток занимает минимум процессорного времени |
-2 |
ТрLower |
Низкий приоритет. Данный поток занимает немного больше процессорного времени, чем имеющий приоритет tpLowest |
-1 |
TpNormal |
Нормальный приоритет. Все потоки по умолчанию имеют приоритет tpNormal |
0 |
TpHigher |
Высокий приоритет. Данный поток имеет приоритет выше нормального |
1 |
TpHighest |
Высший приоритет. Данный поток имеет приоритет выше, чем tpHigher |
2 |
TpTimeCritical |
Наивысший приоритет. Поток с данным приоритетом занимает максимум процессорного времени |
15 |
В блоке uses модуля Unit1 прописать используемые модули Unit2 и Unit3.
Отразить результаты вычислений, производимых потоками, на форме. Для этого создать обработчик события OnTimer, дважды щелкнув на объекте Timer1.
procedure TForml.TimerlTimer(Sender: TObject); begin Editl.text:=IntToStr(Thread1.count); Progressbarl.position:=Thread2.prcount; end;
Запустить приложение на выполнение.
Исследовать работу программы при разных значениях приоритетов.
Изменить программу: добавить возможность приостановки, возобновления и остановки процесса 1 (Thread1) .
Для этого в основном модуле добавить в раздел public поле kluch типа boolean. Если kluch=True, то процесс 1 остановлен.
В процедуре TForm1.FormCreate ввести строку
kluch:=false;
Добавить на форму три кнопки Button с именами :
Поток 1 приостановлен
Поток 1 восстановлен
Поток 1 остановлен
и метку Label1 для отображения состояния потока 1.
В главной программе написать обработчики событий нажатия этих кнопок:
procedure TForm1.Button1Click(Sender: TObject);
begin
if (not Thread1.Suspended and not kluch) then
begin
Thread1.Suspend; // приостановка потока 1
Label1.Caption:=’ Поток 1 приостановлен ‘;
end
else if kluch then Label1.Caption:='Поток 1 нельзя приосстановить'
else Label1.Caption:='Поток 1 уже приостановлен’;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if (Thread1.Suspended and not kluch) then
begin
Thread1.Resume; // возобнавление потока
Label1.Caption:= ’ Поток 2 восстановлен ‘;
end
else if kluch then Label1.Caption:='Поток 1 нельзя восстановить'
else Label1.Caption:='Поток 1 уже востановлен’;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if not kluch then
begin
Thread1.Terminate; // остановка потока и присвоение своству Terminated
// значения True.
Thread1.Free; // удаление экземпляра класса
kluch:=true; // флаг сигнализирует об удалении потока 1
Label1.Caption:= ’ Поток 1 остановлен ‘;
end
else Label1.Caption:='Поток 1 уже был остановлен';
end;
В модуле Unit2 изменить процедуру Execute
procedure TMyThreadl.Execute; begin while not Terminated do // пока поток 1 не остановлен begin count:=random(maxint); end; end;
21. Сохранить модули, запустить программу на выполнение.