ВУЗ:
Составители:
Рубрика:
 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 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;  
       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
Страницы
- « первая
 - ‹ предыдущая
 - …
 - 2
 - 3
 - 4
 - 5
 - 6
 - …
 - следующая ›
 - последняя »
 
