Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




 

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

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;

begin

FreeOnTerminate:=true;

index:=1;

// Запускаем бесконечный счётчик

while index>0 do

begin

Synchronize(UpdateLabel);

Inc(index);

if index>100000 then

index:=0;

// Если поток остановлен, то выйти.

if terminated then exit;

end;

end;

 

В принципе, этой информации вам будет достаточно для написания собственных потоков. У объекта TThread есть ещё несколько свойств и методов, но они не так важны.

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

 

Подробней о синхронизации

 

В предыдущем примере мы использовали процедуру UpdateLabel, в которой на главную форму выводится значение переменной index. Если бы мы программировали главное окно, то вполне логичным было бы создать переменную index локальной для процедуры Execute, а её значение передавать в UpdateLabel в качестве параметра. В потоках с этим проблема. Чтобы передать какие-то значения в процедуру, которая должна вызываться методом Synchronize, нужно пользоваться переменными объекта. Мы даже не советуем пробовать передавать параметры в процедуры, которые вызываются методом Synchronize.

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

Итак, функция SendMessage имеет следующие параметры:

1. Указатель на окно (компонент), которому нужно послать сообщение.

2. Тип сообщения.

3. Первый параметр.

4. Второй параметр.

Судя по функции, нам нужен компонент, у которого есть свойство Handle. В предыдущем примере у нас был TLabel, у которого нет такого свойства, значит, он нам не подходит. Заменим этот компонент на TEdit. Теперь перейдём в поток. Тут в разделе uses нужно добавить два модуля: windows (здесь объявлена сама функция) и messages (здесь находятся все типы сообщений Windows).

Теперь удаляйте из потока процедуру UpdateLabel, больше она не нужна, потому что мы не будем использовать метод Synchronize. Ну и наконец, подкорректируем наш метод Execute:

 

procedure TCountObj.Execute;

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

index:=0;

if terminated then exit;

end;

end;

 

Как видите, теперь у нас вместо метода Synchronize генерируется событие на обновления компонента TEdit. В качестве второго параметра мы указываем тип сообщения WM_SETTEXT – обновить информацию. Третий параметр равен нулю. В последнем параметре нужно указать значение, которое нужно установить. Вот тут есть небольшая сложность. У нас значение представлено в виде целого числа, но нужно превратить его в PChar. Для этого мы сначала конвертируем переменную index в строку (IntToStr), потом приводим его к типу PChar и тут же указываем размер Integer.

 

 

ЛАБОРАТОРНОЕ ЗАДАНИЕ

И МЕТОДИЧЕСКИЕ УКАЗАНИЯ

ПО ЕГО ВЫПОЛНЕНИЮ

 

Лабораторное задание

Согласно варианту задания, полученному при выполнении лабораторной работы № 1, написать программу, которая на основе базы данных создает отчет в Word, используя поток при создании документа в Word.

 






Поделиться с друзьями:


Дата добавления: 2016-10-30; Мы поможем в написании ваших работ!; просмотров: 320 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Бутерброд по-студенчески - кусок черного хлеба, а на него кусок белого. © Неизвестно
==> читать все изречения...

2414 - | 2335 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.