Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Средства синхронизации потоков
Возможными вариантами решения проблемами является 4 объекта, которые разработаны специально для синхронизации. Это такие объекты как событие, взаимное исключение, семофор и таймер. Помимо этого можно организовать ожидание и других объектов, дескриптор которых используется в основном для иных целей, но может применяться и для ожидания. К ним относятся: процесс, поток, оповещение об изменении в файлой системе и консольный ввод. Событие - простейший выбор для задач синхронизации. Класс TEvent (событие) имеет два важных метода: setEvent - перевод объекта в активное состояние и ResetEvent- перевод в пассивное состояние. Конструктор события имеет следующий вид: constructor Create (Event Attributes: PSecurity Attributes; ManualReset, InitialState: Booiean; const Name: string); где параметр initialstate- начальное состояние объекта, ManualReset- способ его перевода в пассивное состояние. Если этот параметр равен True, событие должно быть переведено в пассивное состояние вручную. Иначе событие сбрасывается по мере того, как стартует хоть один поток, ждавший данный объект. Взаимное исключение позволяет владеть ресурсом в данное время одному из потоков. Класс, инкапсулирующий взаимное исключение TMutex. Конструктор: constructor Create(const Name: string); задает имя создаваемого объекта. Первоначально объект не принадлежит никому. Семафор подобен взаимному исключению. Разница между ними состоит в том, что семафор может управлять количеством потоков, имеющим к нему доступ. Семафор устанавливается на максимальное число потоков, к которым разрешен доступ. При достижении количества потоков этого максимума, последующие потоки будут приостановлены. В Delphi можно использовать также объект типа критическая секция. Критические секции подобны взаимным исключениям, однако ,между ними существуют два главных отличия: - взаимные исключения в отличие от критических секций могут быть совместно использованы потоками в различных процессах; - если критическая секция принадлежит другому потоку, ожидающий поток блокируется вплоть до освобождения критической секции. В отличие от этого, взаимное исключение разрешает продолжение по истечении тайм-аута. Критические секции и взаимные исключения очень схожи. На первый взгляд, выигрыш от использования критической секции вместо взаимного исключения не очевиден. Критические секции более эффективны , чем взаимные исключения, т.к. используют меньше системных ресурсов. Критическая секция всегда ждет столько времени, сколько потребуется; взаимные исключения же могут быть установлены на определенный интервал времени, по истечении которого выполнение продолжается. Создание модулей потоков в Delphi Для создания дополнительного потока в программах Delphi предназначен специальный модуль - Thread Object. Для его создания используется команда File -> New. При выборе этого модуля Delphi запрашивает имя класса, который будет дочерним для основополагающего класса TThread. Необходимость наследования связана с тем, что класс TThread содержит абстрактный метод Execute, который обязан перекрываться в потомках. Файл модуля-потока имеет следующую структуру: unit Unit2; interface uses Classes; type MyThread = class(TThread) private Private declarations protected procedure Execute; override; end; implementatoin procedure MyThread. Execute; begin Place thread code here end; end. Программирование потока имеет важное отличие от обычной программы - поток не может использовать методы и свойства визуальных компонентов, которые приводят к изменению внешнего вида программы. Для этого поток обращается к специальному методу Synchronize, с помощью которого осуществляется синхронизация исполнения главного потока с дополнительным. Единственным параметром обращения к этому методу должно быть имя любой процедуры без параметров. Внутри такой процедуры допустимо обращение к методам и свойствам визуальных компонентов. Свойства и методы потоков 1. Procedure Execute; virtual; abstract; - код, исполняемый в создаваемом потоке TThread. 2. property Terminated: Boolean; -это указание потоку завершиться с возможностью корректно освободить ресурсы. 3. Метод WaitFor предназначен для синхронизации и позволяет одному потоку дождаться момента, когда завершится другой поток. 4. Свойство Priority позволяет запросить и установить приоритет потоков. Допустимыми значениями приоритета для объектов TThread являются такие значения tridle, tpLowest, tpLower, tpNormai, tpHigher, tpHignest и tpTimeCritical. 5. procedure Synchronize (Method; TThreadMethod); Этот метод относится к секции protected, т.е. может быть вызван только из потомков TThread, Delphi предоставляет метод Synchronize для безопасного вызова методов VCL внутри потоков. Во избежание конфликтных ситуаций , метод Synchronize дает гарантию, что к каждому объекту VCL одновременно имеет доступ только один поток. Аргумент, передаваемый в метод Synchronize,- это имя метода, который производит обращение к VCL;вызов Synchronize с этим параметром -это то же, что и вызов самого метода. 6. procedure Suspend; 7. Вызов метода Suspend приостанавливает поток, сохраняя возможностью повторного запуска. Метод Suspend приостанавливает поток вне зависимости от кода, который исполняется потоком в данный момент; выполнение продолжается с точки останова. 8. Свойство Suspend позволяет программисту определить, не приостановлен ли поток. Свойство ReturnValue позволяет узнать и установить значение, возвращаемое потоком его завершении.
|
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 565. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |