
- •Мустафина б.М., Сейдахметова г.Е., Әлібиева ж.М.
- •Пәндік оқу - әдістемелік кешені
- •Алматы 2012
- •1. Пәннің оқу бағдарламасы – syllabus
- •Оқытушылар туралы мәліметтер:
- •1.2 Пән туралы мәліметтер:
- •Оқу жоспарының көшірмесі
- •1.3 Пререквизиттер
- •1.6 Тапсырмалардың тізімі мен түрлері және оларды орындау кестесі
- •1.7 Әдебиеттер тізімі
- •1.8 Білімді бақылау және бағалау.
- •1 Модуль бойынша бақылау жүргізуге арналған сұрақтар (1-7 бөлімдер)
- •2 Модуль бойынша бақылау жүргізуге арналған сұрақтар:
- •1.9 Қойылатын талаптар
- •2 Негізгі таратылатын материалдар мазмұны
- •2.1 Курстың тематикалық жоспары
- •2.2 Лекциялық сабақ конспектілері
- •1.1 Windows ож құрылымы Жүйе құрылымының жалпы бейнелеуі
- •2.2. Ағындарды диспетчерлеу және жоспарлау
- •2.3 Ағынды анықтау
- •2.4 Ағындармен жұмыс істеуге арналған api функциясы
- •2.5 Ағындардың приоритеті
- •3.1 Процесстерді басқару
- •3.2 Windows операциялық жүйесіндегі процесстер мен ағындар
- •3.3 Процесстермен жұмыс істеуге арнлаған api функциялар
- •4.2 Ағындарды синхрондау объектілері
- •Мьютекстер
- •5.1 Оқиғалар
- •5.2 Бұғатталған қосымша функциялар
- •7.1. Үймелер
- •7.2 Үйме жадысын басқару
- •8.1 Файлдар мен каталогтарды басқару Файлдарды құру және ашу
- •8.2 Каталогтарды басқару
- •8.3 Файлдар мен каталогтар атрибуттарын алудың басқа әдістері
- •9.1 Файлдарды бұғаттау
- •9.2 Реестр
- •Экспорттелетін идентификаторды анық қосу
- •12.1 Стандартты құрылғылар және консольді енгізу- шығару
- •12.2 Асинхронды енгізу- шығару және аяқталу порттары
- •2.3 Лабораториялық сабақтардың жоспары
- •2.4 Оқытушының басқаруымен студенттің өзіндік жұмысы бойынша оқу жоспары (соөж) (45 сағат)
- •2.5 Студенттің өзіндік жұмысының сабақ жоспары (сөж) (45 сағат)
- •2.6 Өзін өзі тексеру үшін кілтпен көрсетілген тестік жаттығулар
- •2.7 Курс бойынша емтихан сұрақтары
- •Глоссарий
- •Жүйелік программалау
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 функциясын шақыру арқылы псевдодескрипторды дублдеу (көшіру) керек.