Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СП_УМК 2012 каз для 5В070400.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.4 Mб
Скачать

2.4 Ағындармен жұмыс істеуге арналған api функциясы

Ағындарды жасау

Ағын CreateThread функциясымен қалыптасады, және оның прототипі келесідей болады:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // қорғаныс атрибуты

DWORD dwStackSize, // ағын стегінің байт түріндегі көлемі

LPTHREAD_START_ROUTINE IpStartAddress, // функции адресі

LPVOID lpParameter, // параметр адресі

DWORD dwCreationFlags, // ағынды қалыптастыру белгілері

LPDWORD lpThreadld // ағын идентификаторы

Қайтарылатын мән: қалыптасқан ағынның дескрипторы және оның идентификаторы немесе сәтсіздік жағдайында null мәнін қайтарады.

lpStartAddress параметрі ағын орындайтын функцияны көрсетеді. Бұл функцияның прототипі келесідей болуы керек:

DWORD WINAPI ағын функциясының аты (LPVOID lpParameters);

Операциялық жүйенің программалары атқарушы модульдер болып табылады, сондықтан олар тек сигнатурасы алдын ала анықталмаған функцияларды ғана шақыра алады. Сондықтан ағындар үшін құрамында сілтемелері бар ең қарапайым параметрлер тізімі анықталған. Ағындар функциясы операциялық жүйелермен шақырылатындықтан, олар кері шақырылым функциялары депте аталады.

dwCreationFiags параметрі ағын қнадай күйде қалыптасатынын анықтайды.

Ағындардың аяқталуы

Ағын ExitThread функциясын шақыру арқылы аяқталады, оның прототипі келесідей болады:

VOID ExitThread(

DWORD dwExitCode // ағынның аяқталу коды);

Бұл функция ағынның функциясынан мәнді қайтарған кезде ашық түрде, немесе көрінбей шақырылуы мүмкін. Бұл функция орындалғанда жүйе процесспен жүктелген динамикалық кітапханаларға DLL_THREAD_DETACH хабарын жібереді, бұл хабарағынның жұмысы аяқталғанын көрсетеді.

Бір ағын басқа ағынның жұмысын TerminateThread функциясын шақыру арқылы аяқтай алады, оның прототипі:

BOOL TerminateThread (

HANDLE hThread, // ағын дескрипторы

DWORD dwExitThread // ағын аяқталуының кодасы);

Қайтарылатын мән: нөлдік емес мән немесе сәтсіздік кезінде FALSE мәні. TerminateThread функциясы ағынды аяқтағанымен, осы ағынға тиесілі ресурстарды босатпайды. TerminateThread функциясы орындалған кезде жүйе процесспен жүктелген динамикалық кітапханаларға ағынның жұмысы аяқталғанын білдіретін хабар жібермейді. Нәтижесінде динамикалық кітапханалар осы ағынға арналған ресурстарды босатпайды. Сондықтан бұл функцияны тек ағын тұрып қалған кездердегі төтенше жағдайларда ғана шақырылуы тиіс.

Ағынның жұмысын тоқтату және қайта бастау

Әрбір жасалынған ағында тоқтату санашығы (счетчик приостановок) болады, оның максималды мәні - maximum_suspend_count. Тоқтату санашығы ағынның жұмысы қанша рет тоқтатылғанын көрсетеді. Ағын тоқтату санашығы нөлге тең жағдайда ғана орындала алады. Қарсы жағдайда ағын орындалмайды, яғни бос илинип (подвешенном состоянии) тұрады. Әрбір ағынның орындалуы SuspendThread функциясының шақырылуы арқылы тоқтатылуы мүмкін. Оның прототипі:

DWORD SuspendThread(

HANDLE hThread // ағын дескрипторы );

Қайтарылатын мән: осы саншықтың ағынды мәні немесе сәтсіз аяқталған жағдайда —1 мәні. Бұл функция тоқтату санашығының мәнін 1-ге өсіреді. Айта кету керек, ағын өзін өзі тоқтата алады. Ол үшін ағын өзінің псевдодескрипторын SuspendThread функциясына беруі керек. Псевдодескрипторды GetCurrentThread функциясының көмегімен алуға болады.

Ағынның жұмысыны қайта бастау үшін келесі прототиптегі ResumeThread функциясы қолданылады:

DWORD ResumeThread(

HANDLE hThread // ағын дескрипторы );

Қайтарылатын мән: саншықтың ағынды мәні немесе сәтсіздік жағдайында -1 мәні. ResumeThread функциясы тоқтату санашығының мәнін нөлден жоғары болған жағдайда азайтады. Егер тоқтату санашығының алынған мәні 0-ге тен болса, онда ағынның жұмысы қайта басталады, қарсы жағдайда бос ілініп тұрған күйде қалады. Егер ResumeThread функциясын шақыру кезінде тоқтату санашығының мәні 0 болса, онда бұл ағын бос ілініп тұрмағанын білдіреді. Бұл жағдайда функция ешқандай әрекеттерді орындамайды.

Ағын өзінің орындалуын Sleep функциясын шақыру арқылы тежей алады. Sleep функциясының прототипі:

VOID Sleep(

DWORD dwMilliSeconds // миллисекундалар );

Sleep функциясының жалғыз ғана параметрі - ол милисекундалар санын анықтайды, яғни қанша милисекундаға ағын жұмысын тоқтатты. Егер бұл параметрдің мәні нөл болса, онда ағынның орындалуы үзіледі, сосын процессорлық уақытты күтіп тұрған басқа ағын болмаған жағдайда жұмысын қайта бастайды. Егер бұл параметрдің мәні INFINITE болса, онда ағын өзінің жұмысын біржолата тоқтатады, бұл өз алдына қосымша жұмысының тосқауылдануына әкеліп соғады.

Ағындардың псевдодескрипторлары

Кейбір жағдайларда ағынға өзінің қандай да бір сипаттамаларын өзгерту үшін өзінің дескрипторын білуі керек болады. Мысалы, ағын өзінің приоритетін өзгерте алады.

Бұл мақсатта Win32 API жүйесінде төменде прототипі көрсетілген GetcurrentThread функциясы қолданылады:

HANLDE GetCurrentThread(VOID);

Нәтижесінде ағындағы ағынның псевдодескрипторы қайтарылады. Псевдодескриптор нағыз дескриптордан айырмашылығы, оны тек осы ағындағы ағынның өзі ғана қолдана алады. Ағынның псевдодескрипторын қолданып біткен соң жабудың қажеті жоқ. Ағынның псевдодескрипторынан ағынның нағыз дескрипторын алуға болады, ол үшін DuplcateHandie функциясын шақыру арқылы псевдодескрипторды дублдеу (көшіру) керек.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]