Advertisement
KAR98S

TestForPetersonSol.cpp

Aug 31st, 2018 (edited)
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.43 KB | None | 0 0
  1. #include<windows.h>
  2. #include<iostream>
  3. #include<conio.h>
  4.  
  5. #define iP 0
  6. #define jP 1
  7.  
  8. #define dsWAIT 300
  9.  
  10. using namespace std;
  11.  
  12. typedef struct {
  13.     INPUT_RECORD inP;
  14.  
  15.     struct P {
  16.         int turn;
  17.         bool flag[2];
  18.     }p;
  19.  
  20.     unsigned long
  21.         t;
  22.  
  23.     long int
  24.         x;
  25.  
  26.     int
  27.         posi,
  28.         posj,
  29.  
  30.         count,
  31.  
  32.         ijWAIT,
  33.         dWAIT;
  34.  
  35.     bool
  36.         sync,
  37.  
  38.         allowMutex;
  39. }DATA, *PDATA;
  40.  
  41.  
  42. UINT iParallel(LPVOID);
  43. UINT jParallel(LPVOID);
  44. UINT dispParallel(LPVOID);
  45. UINT timeParallel(LPVOID);
  46. UINT inpParallel(LPVOID);
  47.  
  48. void initSettings(PDATA);
  49.  
  50. void drawButton(HANDLE, COORD, bool, bool);
  51.  
  52. bool checkOverlap(PCOORD,PRECT);
  53.  
  54. void Clrscr(HANDLE, COORD);
  55.  
  56. int main() {
  57.  
  58.     PDATA pdata = new DATA;
  59.  
  60.     LPVOID
  61.         iParam = pdata,
  62.         jParam = pdata,
  63.         dispParam = pdata,
  64.         timeParam = &(pdata->t),
  65.         inpParam = pdata;
  66.  
  67.     {
  68.         initSettings(pdata);
  69.     }
  70.  
  71.     HANDLE
  72.         iThread = CreateThread( 0, 0, LPTHREAD_START_ROUTINE(iParallel), iParam, NULL, NULL),
  73.         jThread = CreateThread( 0, 0, LPTHREAD_START_ROUTINE(jParallel), jParam, NULL, NULL),
  74.  
  75.         dispThread = CreateThread(0, 0, LPTHREAD_START_ROUTINE(dispParallel), dispParam, NULL, NULL),
  76.         timeThread = CreateThread(0, 0, LPTHREAD_START_ROUTINE(timeParallel), timeParam, NULL, NULL),
  77.  
  78.         inputThread = CreateThread(0, 0, LPTHREAD_START_ROUTINE(inpParallel), inpParam, NULL, NULL);
  79.  
  80.     HANDLE hArr[5] = { &iThread ,&jThread ,&dispThread, &timeThread, &inputThread };
  81.  
  82.     WaitForMultipleObjects(3, hArr, true, INFINITE);
  83.     //for (int i = 165; i < 255; i++)cout << i << ' ' << char(i)<<'\n';
  84.     _getch();
  85.     delete pdata;
  86.     return 0;
  87. }
  88.  
  89. void initSettings(PDATA pdata) {
  90.    
  91.     HANDLE hO = GetStdHandle(STD_OUTPUT_HANDLE);
  92.  
  93.     pdata->x = pdata->count = 0;
  94.     (pdata->p).flag[iP] = false;
  95.     (pdata->p).flag[jP] = false;
  96.     pdata->sync = false;
  97.     pdata->allowMutex = true;
  98.     pdata->ijWAIT = 100;
  99.     pdata->dWAIT = 25;
  100.    
  101.     {//invisible console cursor
  102.         PCONSOLE_CURSOR_INFO pcci = new CONSOLE_CURSOR_INFO;
  103.  
  104.         GetConsoleCursorInfo(hO, pcci);
  105.         pcci->bVisible = false;
  106.         SetConsoleCursorInfo(hO, pcci);
  107.  
  108.         delete pcci;
  109.     }
  110.  
  111. }
  112.  
  113. UINT iParallel(LPVOID pParam) {
  114.     PDATA pdata = ((PDATA)pParam);
  115.     Sleep(pdata->ijWAIT);
  116.     while (!pdata->sync);
  117.     while (true) {
  118.         pdata->p.flag[iP] = true;
  119.         pdata->p.turn = jP;
  120.         while (pdata->p.flag[jP] && pdata->p.turn == jP && pdata->allowMutex);
  121.  
  122.         Sleep(pdata->ijWAIT);
  123.         pdata->posi = 0;
  124.         (pdata->x) += 1;
  125.         Sleep(pdata->ijWAIT);
  126.         pdata->posi++;
  127.         (pdata->x) += 3;
  128.         Sleep(pdata->ijWAIT);
  129.         pdata->posi++;
  130.         (pdata->x) += 5;
  131.         Sleep(pdata->ijWAIT);
  132.         pdata->posi++;
  133.         (pdata->x) += 7;
  134.         Sleep(pdata->ijWAIT);
  135.         pdata->posi++;
  136.         (pdata->x) += 9;
  137.  
  138.         pdata->count++;
  139.         pdata->p.flag[iP] = false;
  140.     }
  141.  
  142.     return 0;
  143. }
  144.  
  145. UINT jParallel(LPVOID pParam) {
  146.     PDATA pdata = ((PDATA)pParam);
  147.     Sleep(pdata->ijWAIT);
  148.     while (!pdata->sync);
  149.     while (true) {
  150.         pdata->p.flag[jP] = true;
  151.         pdata->p.turn = iP;
  152.         while (pdata->p.flag[iP] && pdata->p.turn == iP && pdata->allowMutex);
  153.  
  154.         Sleep(pdata->ijWAIT);
  155.         pdata->posj = 0;
  156.         (pdata->x) -= 1;
  157.         Sleep(pdata->ijWAIT);
  158.         pdata->posj++;
  159.         (pdata->x) -= 4;
  160.         Sleep(pdata->ijWAIT);
  161.         pdata->posj++;
  162.         (pdata->x) -= 4;
  163.         Sleep(pdata->ijWAIT);
  164.         pdata->posj++;
  165.         (pdata->x) -= 8;
  166.         Sleep(pdata->ijWAIT);
  167.         pdata->posj++;
  168.         (pdata->x) -= 8;
  169.  
  170.         pdata->count++;
  171.         pdata->p.flag[jP] = false;
  172.     }
  173.  
  174.     return 0;
  175. }
  176.  
  177. UINT dispParallel(LPVOID pParam) {
  178.     HANDLE
  179.         hOut = GetStdHandle(STD_OUTPUT_HANDLE),
  180.         hIn = GetStdHandle(STD_INPUT_HANDLE);
  181.  
  182.     const short
  183.         BCOORDMX = 70, BCOORDMY = 1,
  184.         BCOORDFX = 106, BCOORDFY = 1;
  185.  
  186.     const COORD
  187.         bFlipSize = { 3,5 };
  188.  
  189.     COORD
  190.         bmPos = { BCOORDMX,BCOORDMY },
  191.         bfPos = { BCOORDFX,BCOORDFY };
  192.     RECT
  193.         rectM = { BCOORDMX,BCOORDMY,BCOORDMX + bFlipSize.X,BCOORDMY + bFlipSize.Y },
  194.         rectF = { BCOORDFX,BCOORDFY,BCOORDFX + bFlipSize.X,BCOORDFY + bFlipSize.Y };
  195.     COORD tableStart = { 0,2 };
  196.  
  197.     PDATA pdata = ((PDATA)pParam);
  198.     PINPUT_RECORD pIn = &(pdata->inP);
  199.  
  200.     DWORD fwmode = ENABLE_EXTENDED_FLAGS | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
  201.     SetConsoleMode(hIn, fwmode);
  202.  
  203.  
  204.     short
  205.         xPos = 11,
  206.         yPos = 0;
  207.  
  208.     int tmp = 0;
  209.  
  210.     bool
  211.         highlightM = false,
  212.         highlightF = false,
  213.         noRepeatM = true,
  214.         noRepeatF = true,
  215.         switchF = false;
  216.  
  217.     pdata->t = 0;
  218.     pdata->x = 0;
  219.     pdata->sync = true;
  220.     pdata->allowMutex = false;
  221.  
  222.     std::cout << "iParallel | jParallel | timeParallel\n----------|-----------|-------------";
  223.  
  224.     SetConsoleCursorPosition(hOut, { 0 , 9 });
  225.     cout << "History record of x (value of x is recorded if x changes)";
  226.  
  227.     SetConsoleCursorPosition(hOut, { 45,3 });
  228.     cout << "Switch for Mutex lock : ";
  229.     SetConsoleCursorPosition(hOut, { 80,3 });
  230.     cout << "Switch for FastForward : ";
  231.  
  232.     while (true)
  233.     {
  234.         Sleep(pdata->dWAIT);
  235.         Clrscr(hOut,tableStart);
  236.         std::cout << ((pdata->posi == 0) ? char(254) : char(32)) << "x += 1   " << '|' << " x -= 1" << ((pdata->posj == 0) ? char(254) : char(32)) << "   | x = " << pdata->x << '\n';
  237.         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';
  238.         std::cout << ((pdata->posi == 2) ? char(254) : char(32)) << "x += 5   " << '|' << " x -= 4" << ((pdata->posj == 2) ? char(254) : char(32)) << "   |     " << '\n';
  239.         std::cout << ((pdata->posi == 3) ? char(254) : char(32)) << "x += 7   " << '|' << " x -= 8" << ((pdata->posj == 3) ? char(254) : char(32)) << "   |     " << '\n';
  240.         std::cout << ((pdata->posi == 4) ? char(254) : char(32)) << "x += 9   " << '|' << " x -= 8" << ((pdata->posj == 4) ? char(254) : char(32)) << "   |     " << '\n';
  241.  
  242.         std::cout << "\n" << pdata->count / 2 << " Rounds complete!";
  243.  
  244.         if (pdata->x != tmp) {
  245.             SetConsoleCursorPosition(hOut, { yPos * 7,xPos });
  246.             cout << "       ";
  247.             SetConsoleCursorPosition(hOut, { yPos * 7,xPos });
  248.             cout << "x=" << pdata->x;
  249.             SetConsoleCursorPosition(hOut, { yPos * 7,xPos + 1 });
  250.             cout << "-------";
  251.  
  252.             xPos++;
  253.             if (xPos > 35){
  254.                 if (yPos * 7 > 120){
  255.                     yPos = 0;
  256.                 }
  257.                 else
  258.                     yPos++;
  259.                 xPos = 11;
  260.             }
  261.         }
  262.  
  263.         if (checkOverlap(&(pIn->Event.MouseEvent.dwMousePosition), &rectM)){
  264.             highlightM = true;
  265.             if (pIn->Event.MouseEvent.dwButtonState){
  266.                 if (noRepeatM) {
  267.                     noRepeatM = false;
  268.                     pdata->allowMutex = !pdata->allowMutex;
  269.                     pdata->x = 0;
  270.                 }
  271.             }
  272.             else
  273.                 noRepeatM=true;
  274.         }
  275.         else
  276.             highlightM = false;
  277.  
  278.         if (checkOverlap(&(pIn->Event.MouseEvent.dwMousePosition), &rectF)){
  279.             highlightF = true;
  280.             if (pIn->Event.MouseEvent.dwButtonState){              
  281.                 if (noRepeatF) {
  282.                     noRepeatF = false;
  283.                     if (switchF) {
  284.                         switchF = false;
  285.                         pdata->ijWAIT = 100;
  286.                         pdata->dWAIT = 100;
  287.                     }
  288.                     else {
  289.                         switchF = true;
  290.                         pdata->ijWAIT = 10;
  291.                         pdata->dWAIT = 5;
  292.                     }
  293.                 }
  294.             }
  295.             else
  296.                 noRepeatF = true;
  297.  
  298.         }
  299.         else
  300.             highlightF = false;
  301.  
  302.  
  303.         drawButton(hOut, bmPos, highlightM, pdata->allowMutex);
  304.         drawButton(hOut, bfPos, highlightF, switchF);
  305.  
  306.         tmp = pdata->x;
  307.     }
  308.     return 0;
  309. }
  310.  
  311.  
  312.  
  313. UINT timeParallel(LPVOID pParam) {
  314.     int *t = (int*)pParam;
  315.     while (true) {
  316.         Sleep(100);
  317.         (*t)+=100;
  318.     }
  319.     return 0;
  320. }
  321.  
  322. void Clrscr(HANDLE hO, COORD cp) {
  323.     COORD place = { cp.X + 25,cp.Y };
  324.     SetConsoleCursorPosition(hO, place);
  325.         std::cout << "                    ";
  326.     SetConsoleCursorPosition(hO, cp);
  327. }
  328.  
  329. UINT inpParallel(LPVOID pParam) {
  330.     PINPUT_RECORD pIn = &(((PDATA)pParam)->inP);
  331.     LPDWORD nRead = new DWORD;
  332.  
  333.     while (true) {
  334.         Sleep(5);
  335.         ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), pIn, 1, nRead);
  336.     }
  337.     delete nRead;
  338.  
  339.     return 0;
  340. }
  341.  
  342. void drawButton(HANDLE hO, COORD bPos, bool h, bool sw) {
  343.     SetConsoleCursorPosition(hO, bPos);
  344.     cout << char((h) ? 201 : 218) << char((h) ? 205 : 196) << char((h) ? 187 : 191);
  345.     bPos.Y++;
  346.  
  347.     SetConsoleCursorPosition(hO, bPos);
  348.     cout << char((h) ? 186 : 179) << char((sw) ? ((h) ? 219 : 254) : 32) << char((h) ? 186 : 179) << "ON";
  349.     bPos.Y++;
  350.  
  351.     SetConsoleCursorPosition(hO, bPos);
  352.     cout << char((h) ? 204 : 195) << char((h) ? 205 : 196) << char((h) ? 185 : 180);
  353.     bPos.Y++;
  354.  
  355.     SetConsoleCursorPosition(hO, bPos);
  356.     cout << char((h) ? 186 : 179) << char((sw) ? 32 : ((h) ? 219 : 254)) << char((h) ? 186 : 179) << "OFF";
  357.     bPos.Y++;
  358.  
  359.     SetConsoleCursorPosition(hO, bPos);
  360.     cout << char((h) ? 200 : 192) << char((h) ? 205 : 196) << char((h) ? 188 : 217);
  361.  
  362. }
  363.  
  364. bool checkOverlap(COORD *mPos, RECT *box) {
  365.     return ((mPos->X >= box->left && mPos->Y >= box->top && mPos->X < box->right && mPos->Y < box->bottom));
  366. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement