рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Begin index:=1; //Запускаем бесконечный счётчик while index>0 do

Begin index:=1; //Запускаем бесконечный счётчик while index>0 do - раздел Электроника, Дополнительные возможности потоков Begin Synchronize(Updatelabel); Inc(Index); If Index&g...

begin
Synchronize(UpdateLabel);
Inc(index);
if index>100000 then

index:=0;

//Если поток остановлен, то выйти. if terminated then exit; end; end;

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

procedure TCountObj.UpdateLabel; begin Form1.Label1.Caption:=IntToStr(Index); end;

И последнее, что я сделал -подключил главную форму в раздел uses, потому что я обращаюсь к ней в коде выше (Form1.Label1.Caption) для обновления текста компонента Label1.

В методе Execute у меня запускается цикл while, который будет выполняться, пока переменная index больше нуля. Внутри цикла я вызываю метод Synchronize (о нём чуть позже) и увеличиваю переменную index. Если эта переменная становиться больше 100000, то в index присваивается 0 и расчёт начинается с начала. Таким образом цикл будет бесконечно выполнять увеличение переменной indexот 0 до 100000 и опять сначала.

Самой последней идёт проверка, если свойство terminated равно true, то выйти из процедуры. Когда мы выйдём, то работа потока закончиться, потому что закончиться код процедуры Execute. Свойство terminated станет равной true тогда, когда будет вызван метод Terminate нашего потока.

Теперь о магической функции Synchronize. В качестве параметра ей передаётся процедура UpdateLabel, которая производит вывод в главную форму. Для чего нужно вставлять процедуру вывода на экран в Synchronize? Библиотека VCL имеет один недостаток -она не защищена от потоков. Все пользовательские компоненты разрабатывались так, что к ним может получить доступ только один поток. Если главная форма и поток попробуют одновременно вывести что-нибудь в одну и ту же область экрана или компонент, то программа рухнет как башни близнецы. Поэтому весь вывод на форму нужно выделять в отдельную процедуру и вызывать эту процедуру с помощью Synchronize.

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

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

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

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

По нажатию кнопки "Запустить" я написал такой код:

procedure TForm1.Button1Click(Sender: TObject);

begin co:=TCountObj.Create(true); co.Resume; co.Priority:=tpLower;

end;

В первой строке я создаю поток co. В качестве параметра может быть true или false. Если false, то поток сразу начинает выполнение, иначе поток создаётся, но не запускается. Если поток создан не запущенным, то для запуска нужно использовать метод Resume, что я делаю во второй строке.

В третьей строке я устанавливаю приоритет потока поменьше, чтобы он не мешал работе основному потоку и выполнялся в фоне. Если установить приоритет повыше, то основной поток начнёт притормаживать, потому что у них будут одинаковые приоритеты.

По нажатию кнопки "Остановить" я написал:

procedure TForm1.Button1Click(Sender: TObject); begin co.Terminate; end;

Здесь я останавливаю выполнение потока с помощью вызова метода Terminate объекта потока. После вызова этого метода свойство terminated станет равной true и выполнение процедуры Execute закончиться.

Попробуй запустить эту программу, запустить поток (нажатием кнопки "Запустить") и понабирать текст в RichEdit. Текст будет набираться без проблем, и в это время в компоненте ТLabel будет работать счётчик. Если бы ты запустил счётчик без отдельного потока, то ты бы не смог набирать текст в RichEdit, потому что все ресурсы программы (основного потока) уходили бы на работу счётчика.

На компакт диске, в директорииПримерыГлава 17Thread1ты можешь увидеть пример этой программы.

 

17.3 Дополнительные возможности потоков.

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

мы уже рассмотрели, но всё же я обязан сделать ещё несколько замечаний.

Suspend -приостанавливает поток. Для вызова просто напиши co.Suspend. Чтобы

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

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

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

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

procedure TCountObj.Execute;

– Конец работы –

Эта тема принадлежит разделу:

Дополнительные возможности потоков

На сайте allrefs.net читайте: 17.3 Дополнительные возможности потоков. ..................................................................... 408. Глава Потоки...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Begin index:=1; //Запускаем бесконечный счётчик while index>0 do

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

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

Begin index:=1; while index>0 do
begin SendMessage(Form1.Edit1.Handle, WM_SETTEXT, 0, Integer(PChar(IntToStr(index)))); Inc(index); if index>100000 then

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги