Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
36
Добавлен:
06.02.2018
Размер:
7.63 Кб
Скачать
//-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;
}