Добавил:
PaniKati
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторные / лаб8 / новая папка / main
.c//-tWM prog.c
#define true 1
#define false 0
#pragma checkoption -tWM
#include <windows.h>
#include<process.h>
#include <stdio.h>
#include<math.h>
#include <locale.h>
#include <time.h>
#define BF_LEN 11
char szGLOBALBUFFER[BF_LEN];
char Symbols_WRITER_1[] = "abcdefghijklmnopqrstuvwxyz"; // 3 текста для ниток
char Symbols_WRITER_2[] = "ABCDEFGHIJKLMNOPQRSTUVWYZ";
char Symbols_WRITER_3[] = " <+_!%^&*\|@~$>";
HANDLE hstdin, hstdout;
DWORD actlen;
CRITICAL_SECTION csec;
HANDLE hThreadOfReader_1, hThreadOfReader_2, hThreadOfReader_3; // читатели-писатели
HANDLE hThreadOfWriter_1, hThreadOfWriter_2, hThreadOfWriter_3;
HANDLE mReadMutex, mWriteMutex;
int random_num(int X, int Y)
{ return (rand() % (Y-X+1) + X);}
char OUTPUT_FROM_BUFFER(int charPos) //определяем позицию
{
char TMP = szGLOBALBUFFER[charPos];
if(szGLOBALBUFFER[charPos] != ' ' && szGLOBALBUFFER[charPos] != '\0')
{
int bufSize = sizeof(szGLOBALBUFFER);
int i = 0;
for(i = 0; i < bufSize-1; i++)
{
szGLOBALBUFFER[i] = szGLOBALBUFFER[i+1];
}
return TMP;
}
return ' ';
}
int INPUT_TO_BUFFER(char InputChar)
{
int bufSize = sizeof(szGLOBALBUFFER);
int i = 0;
for(i = 0; i < bufSize-1; i++)
{
if(szGLOBALBUFFER[i] == '\0')
{
szGLOBALBUFFER[i] = InputChar;
return true;
}
}
return false;
}
unsigned __stdcall ProcessOfRead_1(void *arg) //первый процесс читатель
{
int k,j;
COORD pos;
//позиция
for(k=0; k<24;k++)
{
WaitForSingleObject(mReadMutex, INFINITE);
pos.X = 20;
pos.Y = k+1;
EnterCriticalSection(&csec); //Вход в критическую секцию
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_BLUE);
printf("%s", szGLOBALBUFFER);
memset(szGLOBALBUFFER, 0, sizeof(szGLOBALBUFFER)/sizeof(szGLOBALBUFFER[0]));
LeaveCriticalSection(&csec); //завершение критической секции программы
Sleep(1);
ReleaseMutex(mReadMutex); Sleep(20);
}
return 1;
}
unsigned __stdcall ProcessOfRead_2(void *arg) //второй процесс читатель
{
int k,j;
COORD pos;
for(k=0; k<24;k++)
{
WaitForSingleObject(mReadMutex, INFINITE);
pos.X = 40;
pos.Y = k+1;
EnterCriticalSection(&csec); //Вход в критическую секцию
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN);
printf("%s", szGLOBALBUFFER);
memset(szGLOBALBUFFER, 0, sizeof(szGLOBALBUFFER)/sizeof(szGLOBALBUFFER[0]));
LeaveCriticalSection(&csec); //завершение критической секции программы
Sleep(20);
ReleaseMutex(mReadMutex); Sleep(20);
}
return 1;
}
unsigned __stdcall ProcessOfRead_3(void *arg) //третий процесс читатель
{
int k,j;
COORD pos;
for(k=0; k<24;k++)
{
WaitForSingleObject(mReadMutex, INFINITE);
pos.X = 60;
pos.Y = k+1;
EnterCriticalSection(&csec); //Вход в критическую секцию
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_RED);
printf("%s", szGLOBALBUFFER);
memset(szGLOBALBUFFER, 0, sizeof(szGLOBALBUFFER)/sizeof(szGLOBALBUFFER[0]));
LeaveCriticalSection(&csec); //завершение критической секции программы
//Sleep(20);
ReleaseMutex(mReadMutex); Sleep(20);
}
return 1;
}
unsigned __stdcall ProcessOfWrite_1(void *arg) //первый процесс писатель
{
while(true) // Повторять пока не будет нажата комбинация клавиш Cntrl-C
{
WaitForSingleObject(mReadMutex, INFINITE);
INPUT_TO_BUFFER(Symbols_WRITER_1[random_num(0, sizeof(Symbols_WRITER_1)-1)]);
Sleep(20);
INPUT_TO_BUFFER(Symbols_WRITER_1[random_num(0, sizeof(Symbols_WRITER_1)-1)]);
Sleep(20);
INPUT_TO_BUFFER(Symbols_WRITER_1[random_num(0, sizeof(Symbols_WRITER_1)-1)]);
Sleep(20);
INPUT_TO_BUFFER(Symbols_WRITER_1[random_num(0, sizeof(Symbols_WRITER_1)-1)]);
Sleep(20);
ReleaseMutex(mReadMutex);// Sleep(20);
}
return 1;
}
unsigned __stdcall ProcessOfWrite_2(void *arg) //второй процесс писатель
{
while(true) // Повторять пока не будет нажата комбинация клавиш Ctrl-C
{
WaitForSingleObject(mReadMutex, INFINITE);
INPUT_TO_BUFFER(toupper(Symbols_WRITER_2[random_num(0, sizeof(Symbols_WRITER_2)-1)]));
Sleep(20);
INPUT_TO_BUFFER(toupper(Symbols_WRITER_2[random_num(0, sizeof(Symbols_WRITER_2)-1)])); Sleep(20);
INPUT_TO_BUFFER(toupper(Symbols_WRITER_2[random_num(0, sizeof(Symbols_WRITER_2)-1)])); Sleep(20);
INPUT_TO_BUFFER(toupper(Symbols_WRITER_2[random_num(0, sizeof(Symbols_WRITER_2)-1)])); Sleep(20);
ReleaseMutex(mReadMutex); //Sleep(20);
}
return 1;
}
unsigned __stdcall ProcessOfWrite_3(void *arg) //третий процесс писатель
{
while(true) // Повторять пока не будет нажата комбинация клавиш Cntrl-C
{
WaitForSingleObject(mReadMutex, INFINITE);
INPUT_TO_BUFFER(Symbols_WRITER_3[random_num(0, sizeof(Symbols_WRITER_3)-1)]);
Sleep(20);
INPUT_TO_BUFFER(Symbols_WRITER_3[random_num(0, sizeof(Symbols_WRITER_3)-1)]);
Sleep(20);
INPUT_TO_BUFFER(Symbols_WRITER_3[random_num(0, sizeof(Symbols_WRITER_3)-1)]);
Sleep(20);
INPUT_TO_BUFFER(Symbols_WRITER_3[random_num(0, sizeof(Symbols_WRITER_3)-1)]);
Sleep(20);
ReleaseMutex(mReadMutex); //Sleep(20);
}
return 1;
}
int main()
{ srand(time(NULL));
//setlocale(LC_ALL,"Russian");
mReadMutex = CreateMutex(NULL, FALSE, NULL); //работаем с mutex-семафорами
mWriteMutex = CreateMutex(NULL, FALSE, NULL);
unsigned threadid1, threadid2, threadid3, threadid4, threadid5, threadid6;
int k;
COORD pos;
hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
InitializeCriticalSection(&csec);
hThreadOfReader_1 = (HANDLE)_beginthreadex(NULL, 0, ProcessOfRead_1, (void*)2, 0, &threadid1); //работаем с читателями-писателями
hThreadOfReader_2 = (HANDLE)_beginthreadex(NULL, 0, ProcessOfRead_2, (void*)3, 0, &threadid2);
hThreadOfReader_3 = (HANDLE)_beginthreadex(NULL, 0, ProcessOfRead_3, (void*)4, 0, &threadid3);
hThreadOfWriter_1 = (HANDLE)_beginthreadex(NULL, 0, ProcessOfWrite_1, (void*)2, 0, &threadid4);
hThreadOfWriter_2 = (HANDLE)_beginthreadex(NULL, 0, ProcessOfWrite_2, (void*)3, 0, &threadid5);
hThreadOfWriter_3 = (HANDLE)_beginthreadex(NULL, 0, ProcessOfWrite_3, (void*)4, 0, &threadid6);
//Sleep(20);
int ckNum = 1;
for(k=0; k<24;k++) //всего 24 шага
{
pos.X = 1;
pos.Y = k+1;
EnterCriticalSection(&csec);
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED); //любой из цветов текста - синий, зеленый, красный
printf("#%d",k+ckNum);
LeaveCriticalSection(&csec); //завершение критической секции программы
//if(k == 23) {k = 0;}
}
getchar();
DeleteCriticalSection(&csec); // После использования объект критической секции должен быть удален
CloseHandle(hThreadOfReader_1); // закроем
CloseHandle(hThreadOfReader_2);
CloseHandle(hThreadOfReader_3);
return 1;
}