Программирование синхронизации процессов в ОС Windows. Разработка программы, осуществляющей решение поставленной задачи с помощью многопоточного приложения, страница 5

DWORD WINAPI ThreadYValue(LPVOID lParam)

{

Buffer *data = (Buffer *)lParam;

while(true)

{

WaitForSingleObject(data->hEvents[ID_EVENT_Y], INFINITE);

if(WaitForSingleObject(hEventExit, 1) == WAIT_OBJECT_0) break; //äëÿ áåçîïàñíîãî çàâåðøåíèÿ

for(int i = 0; i < MAX_BUF_COEF_SIZE; i++)

{

data->yValue[i] = 0;

for(int j = 1; j < i + 1; j++)

data->yValue[i] += exp(1.0 / data->alpha[j]) + exp(1.0 / data->beta[j]);

}

ResetEvent(data->hEvents[ID_EVENT_Y]);

SetEvent(data->hEvents[ID_EVENT_GAMMA]);

}

return 0;

}

DWORD WINAPI ThreadCoefGamma(LPVOID lParam)

{

Buffer *data = (Buffer *)lParam;

while(true)

{

WaitForSingleObject(data->hEvents[ID_EVENT_GAMMA], INFINITE);

if(WaitForSingleObject(hEventExit, 1) == WAIT_OBJECT_0) break; //äëÿ áåçîïàñíîãî çàâåðøåíèÿ

for(int i = 0; i < MAX_BUF_COEF_SIZE; i++)

{

data->gamma[i] = sin(data->xCurrent) * cos(data->yValue[i]) * i;

}

ResetEvent(data->hEvents[ID_EVENT_GAMMA]);

SetEvent(data->hEvents[ID_EVENT_INTEGRAND]);

}

return 0;

}

DWORD WINAPI ThreadIntegrand(LPVOID lParam)

{

Buffer *data = (Buffer *)lParam;

while(true)

{

WaitForSingleObject(data->hEvents[ID_EVENT_INTEGRAND], INFINITE);

if(WaitForSingleObject(hEventExit, 1) == WAIT_OBJECT_0) break; //äëÿ áåçîïàñíîãî çàâåðøåíèÿ

data->func = 0;

for (int i = 0; i < 1001; i++)

{

data->func += data->alpha[i] + data->beta[i] + data->gamma[i];

}

data->func *= log(1.0 + data->xCurrent);

ResetEvent(data->hEvents[ID_EVENT_INTEGRAND]);

SetEvent(data->hEvents[ID_EVENT_INTEGRAL]);

}

return 0;

}

DWORD WINAPI ThreadOutputToFile(LPVOID lParam)

{

Buffer *data = (Buffer *)lParam;

while(true)

{

WaitForSingleObject(data->hEvents[ID_EVENT_FILE], INFINITE);

if(WaitForSingleObject(hEventExit, 1) == WAIT_OBJECT_0) break; //äëÿ áåçîïàñíîãî çàâåðøåíèÿ

WaitForSingleObject(hSemaphoreFile, INFINITE);

FILE* file = fopen("log.txt","a");

fprintf(file, "\n\n");

// Âûâåñòè äàòó:

time_t seconds = time(0);

tm* timeinfo = localtime(&seconds);

fprintf(file, asctime(timeinfo));

//Âûâåñòè èíôîðìàöèþ î âû÷èñëåíèÿõ:

fprintf(file, data->messageLog);

fclose(file);

ReleaseSemaphore(hSemaphoreFile, 1, 0);

ResetEvent(data->hEvents[ID_EVENT_FILE]);

SetEvent(data->hEvents[ID_EVENT_INTEGRAL]);

}

return 0;

}

DWORD WINAPI ThreadOutputCommonInfo(LPVOID lParam)

{

while(true)

{

WaitForSingleObject(bufAB->hEventReady, INFINITE);

WaitForSingleObject(bufCD->hEventReady, INFINITE);

if(WaitForSingleObject(hEventExit, 1) == WAIT_OBJECT_0) break; //äëÿ áåçîïàñíîãî çàâåðøåíèÿ

char message[MAX_SIZE_MESSAGE];

strcpy(message, bufAB->message);

strcat(message, "\n---------------------------\n");

strcat(message, bufCD->message);

strcat(message, "\n---------------------------\n");

char temp[100];

sprintf(temp, "Îáùåå âðåìÿ âûïîëíåíèÿ: %f", bufAB->time + bufCD->time);

strcat(message, temp);

FILE* file = fopen("log.txt","a");

fprintf(file, "\n\n");

fprintf(file, temp);

fclose(file);

MessageBox(*hwndMain, message,"Ðåçóëüòàò", MB_OK|MB_ICONINFORMATION);

ResetEvent(bufAB->hEventReady);

ResetEvent(bufCD->hEventReady);

SetEvent(bufAB->hEvents[ID_EVENT_INTEGRAL]);

SetEvent(bufCD->hEvents[ID_EVENT_INTEGRAL]);

}

return 0;

}

Результат выполнения программы:

Файл

Вывод: разработали программу, осуществляющую решение поставленной задачи с помощью многопоточного приложения