
Представление потока данных в Delphi.pptx
- Количество слайдов: 9
Представление потока данных в Delphi Выполнил: Кунаков А.
Поток В Delphi есть несколько видов потоков – файловый поток, поток в памяти, поток связанный с handle объекта, строковый поток и т. д. Все они унаследованы от своего абстрактного предка TStream. Разобравшись с ним вы сможете единообразно работать с любыми другими потоками. Поток - это некоторая обобщенная модель двоичных данных
У базового класса есть два свойства, унаследованные всеми потомками: Position и Size, которые определяют позицию в потоке и его размер, соответственно. Рассмотрим основные функции класса. Если вы уже работали с файлами, то обращение к этим методам весьма схоже: function Read(var Buffer; Count: Longint): Longint; virtual; abstract; - читает данные из потока в буфер; function Write(const Buffer; Count: Longint): Longint; virtual; abstract; - пишет данные в поток; function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract; - устанавливает позицию в потоке
Есть и пара просто полезных функций: 1. function Copy. From(Source: TStream; Count: Longint): Longint; - эта функция копирует часть или весь поток из другого потока. Этим методом, например, очень удобно копировать файлы. Есть мнение, что работа с потоками, быстрее работы с файлами. К сожалению у меня не было возможности проверить это утверждение… 2. procedure Save. To. File(const File. Name: string); - позволяет сохранить участок памяти в дисковый файл.
Инкапсуляции потоков в Delphi Понятие потока представлено программистами Borland в виде абстрактного класса TThread Каждый разработчик может унаследовать от него свой поток, наделив его нужной функциональностью. Все проблемы по управлению потоками, их синхронизации и т. д. остаются на долю VCL. В рамках данной статьи я не берусь подробно описать и объяснить все механизмы и тонкости задействованные при работе с потоками и все же отошлю вас к литературе данной в конце статьи, а сам же дам лишь обзор потоков.
Когда и зачем используются потоки? Потоки – это объекты, которым процессор выделяет время. Обратите внимание, не процессам или программам, а порожденным им потокам. Так что любая программа содержит в себе хотя бы один поток. Он называется главным. С появлением потоков появилась возможность отдавать для решения каждой задачи ровно столько ресурсов, сколько ей нужно. Для этого используется понятие приоритета потока. Каждый процесс имеет свой приоритет (от фонового до реального времени). В рамках процесса существуют потоки, приоритетом которых (потоков) может управлять процесс. Таким образом приоритет может иметь значение от 0 до 31. Следует заметить, что программы написанные в Delphi по умолчанию порождают процесс с нормальным приоритетом (он может быть переднего или заднего плана, в зависимости от активности задачи и меняться от 9 до 7). Процессы реального времени используются крайне редко.
Чтобы сделать свой поток, вам нужно унаследовать свой класс от объекта TThread. Это можно сделать из меню File -> New… Будет создан модуль с заготовкой для класса. Все что вам нужно сделать – перекрыть метод Execute. Для этого его нужно объявить как override и наделить нужной функциональностью. При написании метода Execute нужно учесть следующее: поток работает параллельно с основным потоком программы и может обращаться к какимто элементам или компонентам также параллельно с основным потоком. Чтобы избежать этого, нужно использовать метод Synchronize. В его параметре следует указать действия, производимые с «общими» объектами. Например Synchronize(Main. Form. Label 1. Caption: =’Hello!’); изменит надпись на форме и не вызовет аварийной ситуации или ситуации гонок, когда два процесса пытаются захватить один и тот же ресурс. Процесс может находиться в двух состояниях – выполняться или быть приостановленным. За это отвечают методы procedure Suspend; procedure Resume; Также процесс может самоуничтожаться по завершении - свойство Free. On. Terminate. Метод function Wait. For: Long. Word; ожидает завершения потока.
Классы для представления потока данных TStream Абстрактный поток, от которого наследуются все остальные. Свойства и методы класса TStream образуют базовый интерфейс потоковых объектов. THandle. Stream Поток, который хранит свои данные в файле. Для чтения-записи файла используется дескриптор (handle), поэтому поток называется дескрипторным. Дескриптор — это номер открытого файла в операционной системе. Его возвращают низкоуровневые функции создания и открытия файла. TFile. Stream Поток, который хранит свои данные в файле. Отличается от Thandle. Stream тем, что сам открывает (создает) файл по имени, переданному в конструктор. TMemory. Stream Поток, который хранит свои данные в оперативной памяти. Моделирует работу с файлом. Используется для хранения промежуточных результатов, когда файловый поток не подходит из -за низкой скорости передачи данных. TResource. Stream Поток, обеспечивающий доступ к ресурсам в Windows-приложении. TBlob. Stream Обеспечивает последовательный доступ к большим полям таблиц в базах данных.
Потоки широко применяются в библиотеке VCL. Ниже кратко перечислены их основные общие свойства и методы. Общие свойства: Position: Longint — текущая позиция чтения-записи. Size: Longint — текущий размер потока в байтах. Общие методы: Copy. From(Source: TStream; Count: Longint): Longint — копирует Count байт из потока Source в свой поток. Read(var Buffer; Count: Longint): Longint — читает Count байт из потока в буфер Buffer, продвигает текущую позицию на Count байт вперед и возвращает число прочитанных байт. Если значение функции меньше значения Count, то в результате чтения был достигнут конец потока. Read. Buffer(var Buffer; Count: Longint) — читает из потока Count байт в буфер Buffer и продвигает текущую позицию на Count байт вперед. Если выполняется попытка чтения за концом потока, то генерируется ошибка. Seek(Offset: Longint; Origin: Word): Longint — продвигает текущую позицию в потоке на Offset байт относительно позиции, заданной параметром Origin. Параметр Origin может иметь одно из следующих значений: 0 — смещение задается относительно начала потока; 1 — смещение задается относительно текущей позиции в потоке; 2 — смещение задается относительно конца потока. Write(const Buffer; Count: Longint): Longint — записывает в поток Count байт из буфера Buffer, продвигает текущую позицию на Count байт вперед и возвращает реально записанное количество байт. Если значение функции отличается от значения Count, то при записи была ошибка. Write. Buffer(const Buffer; Count: Longint) — записывает в поток Count байт из буфера Buffer и продвигает текущую позицию на Count байт вперед. Если по какой-либо причине невозможно записать все байты буфера, то генерируется ошибка.