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

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

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

Begin FreeOnTerminate:=true; 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;

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

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

 

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

предыдущем примере я использовал процедуру UpdateLabel, в которой на главную форму выводиться значение переменной index. Если бы мы программировали главное окно, то вполне логичным было бы создать

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

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

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

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

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

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

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

 

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

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

procedure TCountObj.Execute;

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

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

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

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

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

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

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

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

Begin 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
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги