Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Учебный проект для работы с событиями



#include <windows.h>

#include <stdio.h>

#include <conio.h>

#define THREADCOUNT 4

HANDLE ghWriteEvent;

HANDLE ghThreads[THREADCOUNT];

DWORD WINAPI ThreadProc(LPVOID);

void CreateEventsAndThreads(void)

{

int i;

DWORD dwThreadID;

ghWriteEvent = CreateEvent(

NULL,

TRUE,

FALSE,

TEXT("WriteEvent")

);

if (ghWriteEvent == NULL)

{

printf("CreateEvent failed (%d)\n", GetLastError());

return;

}

for(i = 0; i < THREADCOUNT; i++)

{

ghThreads[i] = CreateThread(

NULL, //Параметры безопасности

0, //Использовать размер стека по умолчанию

ThreadProc, //Функция потока

NULL, //Отсутствуют параметры для потока

0, //Флаги для старта потока по умолчанию

&dwThreadID);

if (ghThreads[i] == NULL)

{

printf("CreateThread failed (%d)\n", GetLastError());

return;

}

}

}

void WriteToBuffer(VOID)

{

printf("Main thread writing to the shared buffer...\n");

Sleep((int)(1000.0/(rand()%10)));

if (! SetEvent(ghWriteEvent))

{

printf("SetEvent failed (%d)\n", GetLastError());

return;

}

}

void CloseEvents()

{

CloseHandle(ghWriteEvent);

}

int main(void)

{

DWORD dwWaitResult;

CreateEventsAndThreads();

WriteToBuffer();

printf("Main thread waiting for threads to exit...\n");

dwWaitResult = WaitForMultipleObjects(

THREADCOUNT, // количество потоков в массиве

ghThreads, // массив дескрипторов потоков

TRUE, // ждать пока все потоки не завершатся

INFINITE);

switch (dwWaitResult)

{

case WAIT_OBJECT_0:

printf("All threads ended, cleaning up for application exit...\n");

break;

default:

printf("WaitForMultipleObjects failed (%d)\n", GetLastError());

return 1;

}

CloseEvents();

_getch();

return 0;

}

DWORD WINAPI ThreadProc(LPVOID lpParam)

{

UNREFERENCED_PARAMETER(lpParam);

DWORD dwWaitResult;

printf("Thread %d waiting for write event...\n", GetCurrentThreadId());

dwWaitResult = WaitForSingleObject(

ghWriteEvent, // дескриптор потока

INFINITE); // ждать вечно

switch (dwWaitResult)

{

case WAIT_OBJECT_0:

printf("Thread %d reading from buffer\n",

GetCurrentThreadId());

break;

default:

printf("Wait error (%d)\n", GetLastError());

return 0;

}

printf("Thread %d exiting\n", GetCurrentThreadId());

return 1;

}





Дата публикования: 2015-10-09; Прочитано: 151 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...