Разработка многопоточных приложений. Рудалев В.Г - 4 стр.

UptoLike

4
2. Создание потоков средствами API
Использование библиотеки API Win32 наиболее мощный и универсаль-
ный способ работы с потоками на большинстве языков программирования [6].
Имеющиеся в Delphi специализированные классы являются надстройкой над со -
ответствующими функциями API.
Поток создается с помощью функции API, возвращающей дескриптор по-
тока
function CreateThread (
Attr: Pointer; // Адрес атрибутов безопасности
Stack: Dword; // Размер стека для потока
Start: Pointer; // Начальный адрес потока
par: pointer; // Аргументы потока
flag: Dword; // флаг создания
var ID: Dword // Возвращаемый идентификатор потока
): THandle; // Результат функции дескриптор потока
Параметр Attr обычно задается равным Nil, что соответствует атрибутам
безопасности по умолчанию (более подробно см . раздел Win32 Programmers Ref-
erence в справочной системе Delphi).
Параметр Stack задает размер стека для потока. Если он равен нулю , то
размер стека совпадает с размером стека основного потока приложения .
Параметр Start основной. Через него передается адрес функции, вызы -
ваемой при запуске потока. Эта функция обязана возвращать результат типа
longint, иметь один параметр типа Pointer. При описании функции необходимо
указывать атрибут stdcall (см . листинг ), определяющий стандартный для API спо-
соб вызова функции (запись аргументов в стек в порядке справа-налево, очистка
стека при завершении работы самой подпрограммой).
Параметр Par указатель на структуру (запись ), содержащую аргументы ,
передаваемые в процедуру потока. Если Par=Nil, то аргументы отсутствуют.
Если задать флаг создания flag, равный нулю , то поток сразу начнет рабо-
ту, а если указать константу CREATE_SUSPENSED, то поток начнет работу толь-
ко после вызова функции
function ResumeThread (hThread: THandle): Dword;
Здесь hThread дескриптор созданного потока.
Приостановить поток можно с помощью функции
function SuspendThread (hThread: THandle): Dword;
Чтобы досрочно завершить поток, следует вызвать функцию Suspend-
Thread , а затем - функцию
function CloseHandle(hThread: THandle): Dword;
       2. С о здан ие п о то ко в средствам и API

       И сп ользование б иб лиотекиAPI Win32 – наиб олее мощ ны й иуниверсаль-
ны й сп особ раб оты сп отоками наб ольш инстве язы ков п рог раммирования [6].
И мею щ иеся в Delphi сп ециализированны е классы являю тся надстройкой над со-
ответствую щ имиф ункциямиAPI.
       П оток создается сп омощ ью ф ункцииAPI, возвращ аю щ ей дескрип тор п о-
тока

       function CreateThread (
         Attr: Pointer;        // Адрес атрибутов безопасности
         Stack: Dword;           // Размер стека для потока
         Start: Pointer;         // Начальный адрес потока
         par: pointer;           // Аргументы потока
         flag: Dword;            // флаг создания
         var ID: Dword // Возвращаемый идентификатор потока
       ): THandle;     // Результат функции – дескриптор потока

        П араметр Attr об ы чно задается равны м Nil, что соответствуетатриб утам
б езоп асностип о умолчанию (б олееп одроб но см. раздел Win32 Programmer’s Ref-
erence в сп равочной системеDelphi).
        П араметр Stack задаетразмер стекадля п отока. Е слион равен нулю , то
размер стекасовп адаетсразмером стекаос       новног о п отокап рилож ения.
        П араметр Start – основной. Ч ерезнег о п ередается адресф ункции, вы зы -
ваемой п ри зап уске п отока. Э та ф ункция об язана возвращ ать результат тип а
longint, иметь один п араметр тип аPointer. П риоп исанииф ункциинеоб ходимо
указы вать атриб утstdcall (см.листинг ), оп ределяю щ ий стандартны й для API сп о-
соб вы зоваф ункции(зап ись арг ументов в с    тек в п орядке сп рава-налево, очистка
стекап ризаверш ениираб оты самой п одп рог раммой).
        П араметр Par – указатель наструктуру (зап ись), содерж ащ ую арг ументы ,
п ередаваемы ев п роцедуру п отока. Е слиPar=Nil, то арг ументы отсутствую т.
        Е сли задать ф лаг с оздания flag, равны й нулю , то п оток сразу начнетраб о-
ту, аеслиуказать константу CREATE_SUSPENSED, то п оток начнетраб оту толь-
ко п ослевы зоваф ункции

       function ResumeThread (hThread: THandle): Dword;

       Здесь hThread – дескрип тор созданног о п отока.
       П риостановить п оток мож но сп омощ ью ф ункции

       function SuspendThread (hThread: THandle): Dword;

       Ч тоб ы досрочно заверш ить п оток, следуетвы звать ф ункцию Suspend-
Thread , азатем - ф ункцию

       function CloseHandle(hThread: THandle): Dword;

4