FName: PChar; // pointer to name (in user address space)
FThreadID: LongWord; // thread ID (-1 indicates caller thread)
FFlags: LongWord; // reserved for future use, must be zero
end;
{$ENDIF}
{ My }
procedure My.SetName;
{$IFDEF MSWINDOWS}
var
ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
ThreadNameInfo.FType := $1000;
ThreadNameInfo.FName := 'MyThread';
ThreadNameInfo.FThreadID := $FFFFFFFF;
ThreadNameInfo.FFlags := 0;
try
RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
except
end;
{$ENDIF}
end;
SetName; // не обязательно
{Здесь размещается код потока}
Класс My наследует от TThreadряд методов. Прежде всего, это конструктор Creates, создающий объект потока:
constructor Create(CreateSuspended: Boolean);
Параметр CreateSuspendedконструктора определяет способ выполнения по-
тока. Если СreateSuspended = false,то выполнение процедуры Executeначинается немедленно после создания объекта. Если CreateSuspended = true,то выполнение начнется только после того, как будет вызван метод Resume:
procedure Resume;
Эта процедура имеет две области применения. Во-первых, она запускает вы-
полнение, если объект потока был создан с CreateSuspended = true.Во-вторых, она запускает приложение, приостановленное ранее методом Suspend:
procedure Suspend;
Таким образом, вы можете в любой момент приостановить выполнение потока методом Suspend,а затем продолжить выполнение методом Resume.
В процедуре Executeможно непосредственно писать операторы выполнения, вызовы каких-то функций. При этом не исключены конфликты между параллельно выполняемыми нитями. В этом случае в процедуре надо вызывать метод Synchronize
procedure Synchronize(Method: TThreadMethod);
В этом определении Method— процедура, работающая с компонентами VCL. Таким образом, при работе с компонентами VCL надежнее строить выполнение следующим образом. Вы пишете процедуру, выполняющую необходимые действия с компонентами VCL. Пусть вы дали ей имя Work. Тогда вы включаете ее объявление в класс потока, например, в раздел private,даете в разделе implementation ее описание, а процедура Executeв этом случае может, например, состоять из единственного оператора Synchronizе(Work):
interface
uses
Classes, …;
type
Т = class(TThread)
private
{ Private declarations }
procedure Work;
protected
procedure Execute; override;
end;
implementation
…
procedure T.Work;
begin
end;
procedure T.execute;
begin
Synchronize(Work)
end;
Нормальное завершение выполнения потока происходит при завершении процедуры Execute.Однако возможно и досрочное завершение выполнения потока. Для этого в его процедуру Executeдолжна быть введена проверка булева свойства Terminated(завершено).
При нормальной работе это свойство равно false.Но если какая-то внешняя нить вызвала метод Terminateобъекта данного потока, то Terminatedстановится равным true.Если предполагается возможность такого завершения выполнения потока, то процедура Executeдолжна периодически проверять значение Terminateипри получении значения trueдолжна завершаться. Например:
procedure Tl.Execute;
begin
repeat
<какие-то операции>
until Terminated;
end;
Пример окно с двумя кнопками и полем TEdit. Одна кнопка запускает поток, который в поле каждую секунду TEdit заносит число увеличивающееся на 1:
Технология COM (Component Object Model — компонентная модель объектов) предоставляет возможность одной программе (клиенту) работать с объектом другой программы (сервера). СОМ — это модель объекта, которая предусматривает полную совместимость во взаимодействии между компонентами, написанными разными компаниями и на разных языках. При этом неважно, где выполняются программы: в одном потоке, в разных потоках, на разных компьютерах.
С точки зрения СОМ приложение содержит несколько объектов (в частном случае может быть один объект). Каждый объект имеет один или несколько интерфейсов. В интерфейсе описаны методы объекта, к которым могут получить доступ внешние программы.
Внешние приложения, обращающиеся к объекту СОМ, являются клиентами СОМ. Клиент получает указатель на интересующий его интерфейс объекта и через этот указатель может вызывать методы объекта.
Таким образом, клиенту достаточно знать интерфейсы объекта и предостав-
ляемые ими методы. Об остальном позаботится система. В нужный момент она запустит сервер СОМ, если он еще не был запущен, сервер создаст объект, объект загрузит все необходимые ему данные и клиенту вернутся указатели на объект и его интерфейсы, с которыми он может работать.
Начиная с Delphi 5, взаимодействие с Word, Excel и многими другими распространенными программами, входящими в стандартную установку Windows и Microsoft Office, может осуществляться из приложений Delphi с помощью компонентов, размещенных в библиотеке на странице Servers.
Приложения Office поставляют сервера COM, которые предоставляют интерфейс доступа к приложению и его объектам. Благодаря этому, разработчик в среде Delphi имеет возможность, создав контроллер автоматизации, управлять сервером.
Всегда существует задающий приложение корневой объект, он всегда называется Application. Каждое приложение Office имеет свой собственный корневой объект – WordApplication, ExcelApplication.
Как только открывается новый документ, будь то PowerPoint, Excel, Word, автоматически создается каркас нового документа, который представляет собой набор библиотек с классами. Объекты этих классов будут доступны в данном документе. Задачей разработчика контроллера автоматизации является получить доступ к корневому объекту сервера, выстроить цепочку доступа к объектам – участникам (встроенным объектам), правильно передать параметры.