Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
37
Добавлен:
06.02.2018
Размер:
7.45 Кб
Скачать
//-tWM prog.c
  
#define true 1
#define false 0
#include <stdlib.h>
#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[] = " <+_!%^&*\|@~$>";
char buffer[13];
int i,N;

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 i;
    COORD pos;
    pos.X=2; pos.Y=0;
    for(i=0;i<22;i++)
    {
        WaitForSingleObject(hmtx2, INFINITE);
        N++;
        if(N==1)
		WaitForSingleObject(hmtx, INFINITE);
        ReleaseSemaphore(hmtx2,1,NULL);
        EnterCriticalSection(&csec);  
        SetConsoleCursorPosition(hout, pos);
        printf("%s ", buffer);
        LeaveCriticalSection(&csec); 
        pos.Y++;
        WaitForSingleObject(hmtx2, INFINITE);
        N--;
        if(N==0)
        ReleaseSemaphore(hmtx,1,NULL);
        ReleaseSemaphore(hmtx2,1,NULL);
        Sleep(2000);
   }
}

unsigned __stdcall ProcessOfRead_2(void *arg) //второй процесс читатель
{
	int i;
    COORD pos;
    pos.X=20; pos.Y=0;
    for(i=0;i<22;i++)
    {
        WaitForSingleObject(hmtx2, INFINITE);
        N++;
        if(N==1)
        WaitForSingleObject(hmtx, INFINITE);
        ReleaseSemaphore(hmtx2,1,NULL);
        EnterCriticalSection(&csec); 
        SetConsoleCursorPosition(hout, pos);
        printf("%s ", buffer);
        LeaveCriticalSection(&csec); 
        pos.Y++;
        WaitForSingleObject(hmtx2, INFINITE);
        N--;
        if(N==0)
        ReleaseSemaphore(hmtx,1,NULL);
        ReleaseSemaphore(hmtx2,1,NULL);
        Sleep(2500);
   }
}

unsigned __stdcall ProcessOfRead_3(void *arg) //третий процесс читатель
{
	int i;
    COORD pos;
    pos.X=40; pos.Y=0;
    for(i=0;i<22;i++)
    {
        WaitForSingleObject(hmtx2, INFINITE);
        N++;
        if(N==1)
        WaitForSingleObject(hmtx, INFINITE);
        ReleaseSemaphore(hmtx2,1,NULL);
        EnterCriticalSection(&csec);
        SetConsoleCursorPosition(hout, pos);
        printf("%s ", buffer);
        LeaveCriticalSection(&csec);
        pos.Y++;
        WaitForSingleObject(hmtx2, INFINITE);
        N--;
        if(N==0)
        ReleaseSemaphore(hmtx,1,NULL);
        ReleaseSemaphore(hmtx2,1,NULL);
        Sleep(2200);
   }
}

unsigned __stdcall ProcessOfWrite_1(void *arg) //первый процесс писатель
{
	 int i;
    while(TRUE)
    {
        WaitForSingleObject(hmtx, INFINITE); //ожидание сигнального сост. хэндла
        for(i=0;i<=5;i++)
        buffer[i] ='A'+i;
        Sleep(1000);
        for(i=6;i<=11;i++)
        buffer[i] ='A'+i;
        buffer[13] ='\0';
        ReleaseSemaphore(hmtx,1,NULL);
        Sleep(2500);
    }
}

unsigned __stdcall ProcessOfWrite_2(void *arg) //второй процесс писатель
{
	
    int i;
    while(TRUE)
    {
        WaitForSingleObject(hmtx, INFINITE);
        for(i=0;i<=5;i++)
        buffer[i] = 'а'+i;
        Sleep(1000);
        for(i=6;i<=11;i++)
        buffer[i] ='а'+i;
        buffer[13] ='\0';
        ReleaseSemaphore(hmtx,1,NULL);
        Sleep(2700);
    }
}

unsigned __stdcall ProcessOfWrite_3(void *arg) //третий процесс писатель
{
	 int i;
    while(TRUE)
    {
        WaitForSingleObject(hmtx, INFINITE);
        for(i=0;i<=5;i++)
        buffer[i] ='%'+i;
        Sleep(1000);
        for(i=6;i<=11;i++)
        buffer[i] ='%'+ i;
        buffer[13] ='\0';
        ReleaseSemaphore(hmtx,1,NULL);
        Sleep(2900);
    }
}

int main()
{	
 DWORD tid1, tid2, tid3, tid4, tid5, tid6;
srand(time(NULL));
hmtx=CreateSemaphore(NULL,1,2,NULL);
    hmtx2=CreateSemaphore(NULL,1,2,NULL);
	//setlocale(LC_ALL,"Russian");

	//eadMutex = 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);
	 hThreadOfReader_1 = CreateThread(NULL, 0, ProcessOfRead_1, (void *)1,  0, &tid1);
    hThreadOfReader_2 = CreateThread(NULL, 0, ProcessOfRead_2, (void *)2,  0, &tid2);
    hThreadOfReader_3 = CreateThread(NULL, 0, ProcessOfRead_3, (void *)3,  0, &tid3);
    hThreadOfWriter_1 = CreateThread(NULL, 0, ProcessOfWrite_1, (void *)4,  0, &tid4);
    hThreadOfWriter_2 = CreateThread(NULL, 0, ProcessOfWrite_2, (void *)5,  0, &tid5);
    hThreadOfWriter_3 = CreateThread(NULL, 0, ProcessOfWrite_3, (void *)6,  0, &tid6);
	
	
	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;
}