Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<windows.h>
- #include<iostream>
- #include<conio.h>
- #define iP 0
- #define jP 1
- #define dsWAIT 300
- using namespace std;
- typedef struct {
- INPUT_RECORD inP;
- struct P {
- int turn;
- bool flag[2];
- }p;
- unsigned long
- t;
- long int
- x;
- int
- posi,
- posj,
- count,
- ijWAIT,
- dWAIT;
- bool
- sync,
- allowMutex;
- }DATA, *PDATA;
- UINT iParallel(LPVOID);
- UINT jParallel(LPVOID);
- UINT dispParallel(LPVOID);
- UINT timeParallel(LPVOID);
- UINT inpParallel(LPVOID);
- void initSettings(PDATA);
- void drawButton(HANDLE, COORD, bool, bool);
- bool checkOverlap(PCOORD,PRECT);
- void Clrscr(HANDLE, COORD);
- int main() {
- PDATA pdata = new DATA;
- LPVOID
- iParam = pdata,
- jParam = pdata,
- dispParam = pdata,
- timeParam = &(pdata->t),
- inpParam = pdata;
- {
- initSettings(pdata);
- }
- HANDLE
- iThread = CreateThread( 0, 0, LPTHREAD_START_ROUTINE(iParallel), iParam, NULL, NULL),
- jThread = CreateThread( 0, 0, LPTHREAD_START_ROUTINE(jParallel), jParam, NULL, NULL),
- dispThread = CreateThread(0, 0, LPTHREAD_START_ROUTINE(dispParallel), dispParam, NULL, NULL),
- timeThread = CreateThread(0, 0, LPTHREAD_START_ROUTINE(timeParallel), timeParam, NULL, NULL),
- inputThread = CreateThread(0, 0, LPTHREAD_START_ROUTINE(inpParallel), inpParam, NULL, NULL);
- HANDLE hArr[5] = { &iThread ,&jThread ,&dispThread, &timeThread, &inputThread };
- WaitForMultipleObjects(3, hArr, true, INFINITE);
- //for (int i = 165; i < 255; i++)cout << i << ' ' << char(i)<<'\n';
- _getch();
- delete pdata;
- return 0;
- }
- void initSettings(PDATA pdata) {
- HANDLE hO = GetStdHandle(STD_OUTPUT_HANDLE);
- pdata->x = pdata->count = 0;
- (pdata->p).flag[iP] = false;
- (pdata->p).flag[jP] = false;
- pdata->sync = false;
- pdata->allowMutex = true;
- pdata->ijWAIT = 100;
- pdata->dWAIT = 25;
- {//invisible console cursor
- PCONSOLE_CURSOR_INFO pcci = new CONSOLE_CURSOR_INFO;
- GetConsoleCursorInfo(hO, pcci);
- pcci->bVisible = false;
- SetConsoleCursorInfo(hO, pcci);
- delete pcci;
- }
- }
- UINT iParallel(LPVOID pParam) {
- PDATA pdata = ((PDATA)pParam);
- Sleep(pdata->ijWAIT);
- while (!pdata->sync);
- while (true) {
- pdata->p.flag[iP] = true;
- pdata->p.turn = jP;
- while (pdata->p.flag[jP] && pdata->p.turn == jP && pdata->allowMutex);
- Sleep(pdata->ijWAIT);
- pdata->posi = 0;
- (pdata->x) += 1;
- Sleep(pdata->ijWAIT);
- pdata->posi++;
- (pdata->x) += 3;
- Sleep(pdata->ijWAIT);
- pdata->posi++;
- (pdata->x) += 5;
- Sleep(pdata->ijWAIT);
- pdata->posi++;
- (pdata->x) += 7;
- Sleep(pdata->ijWAIT);
- pdata->posi++;
- (pdata->x) += 9;
- pdata->count++;
- pdata->p.flag[iP] = false;
- }
- return 0;
- }
- UINT jParallel(LPVOID pParam) {
- PDATA pdata = ((PDATA)pParam);
- Sleep(pdata->ijWAIT);
- while (!pdata->sync);
- while (true) {
- pdata->p.flag[jP] = true;
- pdata->p.turn = iP;
- while (pdata->p.flag[iP] && pdata->p.turn == iP && pdata->allowMutex);
- Sleep(pdata->ijWAIT);
- pdata->posj = 0;
- (pdata->x) -= 1;
- Sleep(pdata->ijWAIT);
- pdata->posj++;
- (pdata->x) -= 4;
- Sleep(pdata->ijWAIT);
- pdata->posj++;
- (pdata->x) -= 4;
- Sleep(pdata->ijWAIT);
- pdata->posj++;
- (pdata->x) -= 8;
- Sleep(pdata->ijWAIT);
- pdata->posj++;
- (pdata->x) -= 8;
- pdata->count++;
- pdata->p.flag[jP] = false;
- }
- return 0;
- }
- UINT dispParallel(LPVOID pParam) {
- HANDLE
- hOut = GetStdHandle(STD_OUTPUT_HANDLE),
- hIn = GetStdHandle(STD_INPUT_HANDLE);
- const short
- BCOORDMX = 70, BCOORDMY = 1,
- BCOORDFX = 106, BCOORDFY = 1;
- const COORD
- bFlipSize = { 3,5 };
- COORD
- bmPos = { BCOORDMX,BCOORDMY },
- bfPos = { BCOORDFX,BCOORDFY };
- RECT
- rectM = { BCOORDMX,BCOORDMY,BCOORDMX + bFlipSize.X,BCOORDMY + bFlipSize.Y },
- rectF = { BCOORDFX,BCOORDFY,BCOORDFX + bFlipSize.X,BCOORDFY + bFlipSize.Y };
- COORD tableStart = { 0,2 };
- PDATA pdata = ((PDATA)pParam);
- PINPUT_RECORD pIn = &(pdata->inP);
- DWORD fwmode = ENABLE_EXTENDED_FLAGS | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
- SetConsoleMode(hIn, fwmode);
- short
- xPos = 11,
- yPos = 0;
- int tmp = 0;
- bool
- highlightM = false,
- highlightF = false,
- noRepeatM = true,
- noRepeatF = true,
- switchF = false;
- pdata->t = 0;
- pdata->x = 0;
- pdata->sync = true;
- pdata->allowMutex = false;
- std::cout << "iParallel | jParallel | timeParallel\n----------|-----------|-------------";
- SetConsoleCursorPosition(hOut, { 0 , 9 });
- cout << "History record of x (value of x is recorded if x changes)";
- SetConsoleCursorPosition(hOut, { 45,3 });
- cout << "Switch for Mutex lock : ";
- SetConsoleCursorPosition(hOut, { 80,3 });
- cout << "Switch for FastForward : ";
- while (true)
- {
- Sleep(pdata->dWAIT);
- Clrscr(hOut,tableStart);
- std::cout << ((pdata->posi == 0) ? char(254) : char(32)) << "x += 1 " << '|' << " x -= 1" << ((pdata->posj == 0) ? char(254) : char(32)) << " | x = " << pdata->x << '\n';
- std::cout << ((pdata->posi == 1) ? char(254) : char(32)) << "x += 3 " << '|' << " x -= 4" << ((pdata->posj == 1) ? char(254) : char(32)) << " | t = " << (pdata->t)/1000 << " s" << '\n';
- std::cout << ((pdata->posi == 2) ? char(254) : char(32)) << "x += 5 " << '|' << " x -= 4" << ((pdata->posj == 2) ? char(254) : char(32)) << " | " << '\n';
- std::cout << ((pdata->posi == 3) ? char(254) : char(32)) << "x += 7 " << '|' << " x -= 8" << ((pdata->posj == 3) ? char(254) : char(32)) << " | " << '\n';
- std::cout << ((pdata->posi == 4) ? char(254) : char(32)) << "x += 9 " << '|' << " x -= 8" << ((pdata->posj == 4) ? char(254) : char(32)) << " | " << '\n';
- std::cout << "\n" << pdata->count / 2 << " Rounds complete!";
- if (pdata->x != tmp) {
- SetConsoleCursorPosition(hOut, { yPos * 7,xPos });
- cout << " ";
- SetConsoleCursorPosition(hOut, { yPos * 7,xPos });
- cout << "x=" << pdata->x;
- SetConsoleCursorPosition(hOut, { yPos * 7,xPos + 1 });
- cout << "-------";
- xPos++;
- if (xPos > 35){
- if (yPos * 7 > 120){
- yPos = 0;
- }
- else
- yPos++;
- xPos = 11;
- }
- }
- if (checkOverlap(&(pIn->Event.MouseEvent.dwMousePosition), &rectM)){
- highlightM = true;
- if (pIn->Event.MouseEvent.dwButtonState){
- if (noRepeatM) {
- noRepeatM = false;
- pdata->allowMutex = !pdata->allowMutex;
- pdata->x = 0;
- }
- }
- else
- noRepeatM=true;
- }
- else
- highlightM = false;
- if (checkOverlap(&(pIn->Event.MouseEvent.dwMousePosition), &rectF)){
- highlightF = true;
- if (pIn->Event.MouseEvent.dwButtonState){
- if (noRepeatF) {
- noRepeatF = false;
- if (switchF) {
- switchF = false;
- pdata->ijWAIT = 100;
- pdata->dWAIT = 100;
- }
- else {
- switchF = true;
- pdata->ijWAIT = 10;
- pdata->dWAIT = 5;
- }
- }
- }
- else
- noRepeatF = true;
- }
- else
- highlightF = false;
- drawButton(hOut, bmPos, highlightM, pdata->allowMutex);
- drawButton(hOut, bfPos, highlightF, switchF);
- tmp = pdata->x;
- }
- return 0;
- }
- UINT timeParallel(LPVOID pParam) {
- int *t = (int*)pParam;
- while (true) {
- Sleep(100);
- (*t)+=100;
- }
- return 0;
- }
- void Clrscr(HANDLE hO, COORD cp) {
- COORD place = { cp.X + 25,cp.Y };
- SetConsoleCursorPosition(hO, place);
- std::cout << " ";
- SetConsoleCursorPosition(hO, cp);
- }
- UINT inpParallel(LPVOID pParam) {
- PINPUT_RECORD pIn = &(((PDATA)pParam)->inP);
- LPDWORD nRead = new DWORD;
- while (true) {
- Sleep(5);
- ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), pIn, 1, nRead);
- }
- delete nRead;
- return 0;
- }
- void drawButton(HANDLE hO, COORD bPos, bool h, bool sw) {
- SetConsoleCursorPosition(hO, bPos);
- cout << char((h) ? 201 : 218) << char((h) ? 205 : 196) << char((h) ? 187 : 191);
- bPos.Y++;
- SetConsoleCursorPosition(hO, bPos);
- cout << char((h) ? 186 : 179) << char((sw) ? ((h) ? 219 : 254) : 32) << char((h) ? 186 : 179) << "ON";
- bPos.Y++;
- SetConsoleCursorPosition(hO, bPos);
- cout << char((h) ? 204 : 195) << char((h) ? 205 : 196) << char((h) ? 185 : 180);
- bPos.Y++;
- SetConsoleCursorPosition(hO, bPos);
- cout << char((h) ? 186 : 179) << char((sw) ? 32 : ((h) ? 219 : 254)) << char((h) ? 186 : 179) << "OFF";
- bPos.Y++;
- SetConsoleCursorPosition(hO, bPos);
- cout << char((h) ? 200 : 192) << char((h) ? 205 : 196) << char((h) ? 188 : 217);
- }
- bool checkOverlap(COORD *mPos, RECT *box) {
- return ((mPos->X >= box->left && mPos->Y >= box->top && mPos->X < box->right && mPos->Y < box->bottom));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement