Представление потока кода в Delphi.pptx
- Количество слайдов: 23
Варзаева Алёна ПРЕДСТАВЛЕНИЕ ПОТОКА КОДА В DELPHI
Поток (thread) — это подпрограмма, выполняемая параллельно с главной программой (вообще говоря, главная программа тоже считается потоком, но этот поток ассоциирован с целым процессом). Поток может выполнять любую подпрограмму, более того, одна и та же подпрограмма может одновременно выполняться несколькими потоками. Все потоки имеют одно и то же виртуальное адресное пространство, обращаются к одним глобальным переменным и ресурсам своего процесса. Поток — это базовая единица, которой операционная система выделяет время процессора. type TMy. Thread = Class (TThread); … end;
Чтобы создать модуль для потока. Для этого выберите пункт меню File | New | Other для открытия окна создания нового модуля. Найдите в этом окне на вкладке New пункт Thread Object. Выделите его и нажмите кнопку ОК. В результате появится окно. В этом окне нужно указать имя создаваемого потока. Назовем поток— TCountobj. Теперь нажмите кнопку ОК, и Delphi создаст модуль-заготовку для нашего будущего потока. Сохраните весь проект — главную форму под именем Main, поток под именем My. Thread.
unit My. Thread; interface uses Classes; type TCount. Obj = class (TThread) private { Private declarations } protected procedure Execute; override; end; implementation { Important: Methods and properties of objects in VCL can only be used in a method called using Synchronize, for example, Synchronize (Update. Caption) ; and Update. Caption could look like, procedure TCount. Obj. Update. Caption; begin Forml. Caption : = 'Updated in a thread'; end;
Представление потока в Delphi В Delphi потоки представляются объектами. Чтобы создать поток, необходимо породить новый класс от класса TThread (объявлен в модуле Classes), перекрыть в нем виртуальный метод Execute и поместить в этот метод программный код потока. Запуск потока осуществляется путем создания объекта такого класса. В момент создания у объекта автоматически вызывается метод Execute, который начинает выполняться одновременно с участком кода, создавшим поток. После работы метода Execute поток автоматически завершается и объект потока уничтожается.
Изучение класса TThread constructor Create(Create. Suspended: Boolean); Конструктор в качестве аргумента он получает параметр Create. Suspended. Если его значение равно True, вновь созданный поток не начинает выполняться до тех пор, пока не будет сделан вызов метода Resume. В случае, если Create. Suspended имеет значение False, поток начинает исполнение и конструктор завершается.
destructor Destroy; override; Деструктор Destroy вызывается, когда необходимость в созданном потоке отпадает. Деструктор завершает его и высвобождает все ресурсы, связанные с объектом TThread. procedure Resume; Метод Resume класса TThread вызывается, когда поток возобновляется после остановки, или если он был создан с параметром Create. Suspended равным True.
Пример procedure TForm 1. Button 1 Click(Sender: TObject); begin if My. Thread. Suspended then begin Button 1. Caption : = 'Suspend'; FMy. Thread. Resume end else begin Buttonl. Caption : = 'Resume'; FMy. Thread. Suspend; End; end;
procedure Suspend; Вызов метода suspend приостанавливает поток с возможностью повторного запуска впоследствии. Метод suspend приостанавливает поток вне зависимости от кода, исполняемого потоком в данный момент; выполнение продолжается с точки останова. property Suspended: Boolean; Свойство suspended позволяет определить не приостановлен ли поток. С помощью этого свойства можно также запускать и останавливать поток. Установив suspended в True, вы получите тот же результат, что и при вызове метода Suspend — приостановку. Наоборот, установка Suspended в False возобновляет выполнение потока, как и вызов метода Resume.
function Terminate: Integer; Для окончательного завершения потока (без последующего запуска) существует метод Terminate; он останавливает поток и возвращает управление вызвавшему процессу только после того, как это произошло. Значение, возвращаемое функцией Terminate, соответствует состоянию потока. Примерами возможных состояний являются случай нормального завершения и случай, когда к моменту вызова Terminate поток уже завершился (или был завершен из другого потока).
Пример procedure TMy. Thread. Execute; begin { Здесь поместить код потока } while not Terminated do begin // сюда добавить обработку потока end; // главный модуль procedure TForm 1. Button 2 Click(Sender: TObject); begin FMy. Thread. Terminate; end;
property Terminated: Boolean; Свойство Terminated позволяет узнать, произошел ли уже вызов метода Terminate ИЛИ нет. function Wait. For: Integer; Метод Wait. For предназначен для синхронизации и позволяет одному потоку дождаться момента, когда завершится другой поток. Если вы внутри потока под именем First. Thread пишете код: Code : = Second. Thread. Wait. For; то это означает, что поток First. Thread останавливается до момента завершения потока Second. Thread. Метод Wait. For возвращает код завершения ожидаемого потока.
Property Handle: THandle read FHandle; Property Thread. ID: THandle read FThread. ID; Свойства Handle и Thread. ID дают непосредственный доступ к потоку средствами Win 32 API. Если разработчик хочет обратиться к потоку и управлять им, минуя возможности класса TThread, значения Handle и Thread. ID могут быть использованы в качестве аргументов функций Win 32 API. Например, если программист хочет перед продолжением выполнения приложения дождаться завершения сразу нескольких потоков, он должен вызвать функцию API wait. For. Multiple. Objects; для ее вызова необходим массив дескрипторов потоков.
property Priority: TThread. Priority; Свойство priority позволяет запросить и установить приоритет потоков. Приоритет определяет, насколько часто поток получает время процессора. Свойство Priority может принимать следующие значения: tpidle Работает, когда система простаивает tplowest Нижайший tplower Низкий tpnormal Нормальный tphigher Высокий tphighest Высочайший tptimecritical Критический Допустимыми значениями приоритета являются tpldie, tp. Lowest,
procedure Synchronize(Method: TThread. Method); Этот метод относится к секции protected, то есть может быть вызван только из потомков TThread. Delphi предоставляет программисту метод Synchronize для безопасного вызова методов VCL внутри потоков. Во избежание ситуаций гонок, метод Synchronize дает гарантию, что к каждому объекту VCL одновременно имеет доступ только один поток. Аргумент, передаваемый в метод Synchronize, — это имя метода, который производит обращение к VCL; вызов Synchronize с этим параметром — это то же, что и вызов самого метода.
Прмер procedure TMain. Form. Sync. Show. Message; begin Show. Message(Int. To. Str(Listl. Count)); //другие обращения к VCL end;
Procedure Execute; virtual; abstract; Это и есть главный метод объекта TThread. В его теле должен содержаться код, который и представляет собой собственно поток. Метод Execute класса TThread объявлен как абстрактный. Переопределяя метод Execute, мы можем тем самым закладывать в новый потоковый класс то, что будет выполняться при его запуске. Если поток был создан с аргументом Сreate. Suspended, равным False, то метод Execute выполняется немедленно, в противном случае Execute выполняется после вызова метода Resume. EXECUTE PROCEDURE table_show;
С завершением потока надо быть очень внимательным — если он зациклился и не реагирует на сигналы завершения, то зависнет все приложение. Property Return. Value: Integer; Свойство Return. Value позволяет узнать и установить значение, возвращаемое потоком при его завершении. Эта величина полностью определяется пользователем. По умолчанию поток возвращает ноль, но если программист захочет вернуть другую величину, то простая переустановка свойства Reiurnvalue внутри потока позволит получить эту информацию другим потокам. Это, к примеру, может пригодиться, если внутри потока возникли проблемы, или с помощью Return. Value нужно вернуть число не прошедших орфографическую проверку слов.
Свойства потока Position — указывает на текущую позицию курсора в потоке. Начиная с этой позиции будет происходить чтение данных; Size — размер данных в потоке.
Методы потока Copy. From — метод предназначен для копирования из другого потока. У него два параметра: указатель на поток, из которого надо копировать, и число, показывающее размер данных, подлежащих копированию; Read — прочитать данные из потока, начиная с текущей позиции курсора. У этого метода два параметра — буфер, в который будет происходить чтение, и число, показывающее размер данных для копирования;
Seek — переместиться в новую позицию в потоке. У этого метода два параметра: число, указывающее на позицию, в которую надо перейти. Если вам нужно передвинуться на пять байт, то просто укажите цифру 5. Второй параметр: откуда надо двигаться. Тут возможны три варианта: • so. From. Beginning — двигаться на указанное количество байт от начала файла; • so. From. Current — двигаться на указанное количество байт от текущей позиции в файле к концу файла; • so. From. End — двигаться от конца файла к началу на указанное количество байт.
setsize — установить размер потока. Здесь только один параметр — число, указывающее новый размер потока. Допустим, что вам надо уменьшить размер файла. В этом случае с помощью метода setsize потока TFiie. Stream вы можете уменьшить или даже увеличить размер файла. write — записать данные в текущую позицию потока. У этого метода два параметра: • переменная, содержимое которой нужно записать; • число байт для записи.
Спасибо за внимание