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;
}
Результат выполнения программы:
Файл
Вывод: разработали программу, осуществляющую решение поставленной задачи с помощью многопоточного приложения
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.