Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <fstream>
  6. #include <vector>
  7. #include <time.h>
  8. #include <algorithm>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. CRITICAL_SECTION g_cs;
  14.  
  15. struct Proizvedenie {
  16. public:
  17.     int* x;
  18.     int* y;
  19.     int* z;
  20.     int n;
  21.  
  22.     Proizvedenie() {
  23.         n = 3;
  24.         x = new int[n];
  25.         y = new int[n];
  26.         z = new int[n];
  27.         for (int i = 0; i < n; ++i) {
  28.             x[i] = (int)rand(); // RAND_MAX;
  29.             y[i] = (int)rand(); // RAND_MAX;
  30.             z[i] = (int)rand(); // RAND_MAX;
  31.         }
  32.     }
  33.     ~Proizvedenie() {
  34.         delete x;
  35.         delete y;
  36.         delete z;
  37.     }
  38.     friend ostream& operator<<(ostream& out, const Proizvedenie& myProizvedenie) {
  39.         for (int i = 0; i < myProizvedenie.n - 1; ++i) {
  40.             out << myProizvedenie.x[i] << " | " << myProizvedenie.y[i] << " | " << myProizvedenie.z[i] << "\t ";
  41.         }
  42.         out << "\t " << myProizvedenie.x[myProizvedenie.n - 1] << " | " << myProizvedenie.y[myProizvedenie.n - 1] << " | "<< myProizvedenie.y[myProizvedenie.n - 1] << "\t";
  43.         return out;
  44.     }
  45.  
  46. };
  47.  
  48.  
  49. DWORD WINAPI proizvedenie(LPVOID arg);
  50.  
  51. struct myThread {
  52. public:
  53.     HANDLE handlerss;
  54.     int solvedTasks;
  55.     long time;
  56.     long minT;
  57.     long maxT;
  58.  
  59.     myThread() {
  60.         handlerss = CreateThread(NULL, 0, proizvedenie, this, CREATE_SUSPENDED, NULL);
  61.         if (handlerss == NULL)
  62.             exit(GetLastError());
  63.         solvedTasks = 0;
  64.         time = 0;
  65.         minT = MAXDWORD;
  66.         maxT = -1;
  67.     }
  68. };
  69.  
  70. int taskCount = 100, threadCount = 13;
  71. int thisTask = 0;
  72. int errors = 0;
  73. int notSol = 0;
  74. vector<pair<Proizvedenie*, int>> tasks;
  75.  
  76. int proizvedenie(int* xp, int* yp, int* zp) // Функция вычисления
  77. {
  78.     int c = 0;
  79.     int tmp[3];
  80.    
  81.     tmp[0] = xp[1] * yp[2] - xp[2] * yp[1];
  82.     tmp[1] = xp[0] * yp[2] - xp[2] * yp[0];
  83.     tmp[2] = xp[0] * yp[1] - xp[1] * yp[0];
  84.     c = (tmp[0] * zp[0]) - (tmp[1] * zp[1]) + (tmp[2] * zp[2]);
  85.    
  86.  
  87.     return c; // Возвращаю результат
  88. }
  89.  
  90.  
  91. DWORD WINAPI proizvedenie(LPVOID arg)
  92. {
  93.     myThread* thisThread = static_cast<myThread*>(arg);
  94.     int myTask = 0;
  95.     while (thisTask < taskCount) {
  96.         int start = GetTickCount();
  97.         EnterCriticalSection(&g_cs);
  98.         if (thisTask < taskCount) {
  99.             myTask = thisTask;
  100.             ++thisTask;
  101.         }
  102.         LeaveCriticalSection(&g_cs);
  103.         if (myTask < taskCount) {
  104.             try {
  105.                 int* x = new int[3];
  106.                 int* y = new int[3];
  107.                 int* z = new int[3];
  108.                 int n;
  109.                 for (int i = 0; i < 3; i++) {
  110.                     x[i] = tasks[myTask].first->x[i];
  111.                     y[i] = tasks[myTask].first->y[i];
  112.                     z[i] = tasks[myTask].first->z[i];
  113.                 }
  114.                 n = tasks[myTask].first->n;
  115.                 tasks.at(myTask).second = proizvedenie(x, y, z);
  116.                 thisThread->solvedTasks++;
  117.             }
  118.             catch (...) {
  119.                 tasks[myTask].second = INFINITE;
  120.                 errors++;
  121.             }
  122.             int end = GetTickCount();
  123.             int taskT = abs(end - start);
  124.  
  125.             thisThread->time += taskT;
  126.             if (thisThread->maxT < taskT)
  127.                 thisThread->maxT = taskT;
  128.             if (thisThread->minT > taskT)
  129.                 thisThread->minT = taskT;
  130.  
  131.         }
  132.     }
  133.     return 0;
  134. }
  135.  
  136.  
  137. int main()
  138. {
  139.     system("color 0f");
  140.     setlocale(LC_ALL, "Russian");
  141.     cout << "Количество задач = ";
  142.     cin >> taskCount;
  143.     cout << "Количкство процессов = ";
  144.     cin >> threadCount;
  145.     for (int i = 0; i<taskCount; ++i) {
  146.         tasks.push_back(*(new pair<Proizvedenie*, int>(new Proizvedenie(), INFINITE)));
  147.     }
  148.  
  149.     myThread** proces = new myThread*[threadCount];
  150.     HANDLE* handlersss = new HANDLE[threadCount];
  151.     InitializeCriticalSection(&g_cs);
  152.     for (int i = 0; i < threadCount; ++i) {
  153.         proces[i] = new myThread();
  154.         handlersss[i] = proces[i]->handlerss;
  155.     }
  156.     for (int i = 0; i < threadCount; ++i) {
  157.         ResumeThread(handlersss[i]);
  158.     }
  159.     WaitForMultipleObjects(threadCount, handlersss, true, INFINITE);
  160.     Sleep(100);
  161.     for (int i = 0; i < threadCount; ++i) {
  162.         CloseHandle(handlersss[i]);
  163.     }
  164.     DeleteCriticalSection(&g_cs);
  165.     ofstream out("output.txt");
  166.     int start = GetTickCount();
  167.     for (int i = 0; i < taskCount; ++i) {
  168.         out << *tasks.at(i).first << "\tОтвет: = ";
  169.         if (tasks.at(i).second == INFINITE)
  170.             out << "Ошибка" << endl;
  171.         else
  172.             out << tasks.at(i).second << endl;
  173.     }
  174.     int end = GetTickCount();
  175.     out.close();
  176.     int time = end - start;
  177.  
  178.     cout << "Решенных задач:\t" << taskCount - (errors + notSol) << endl;
  179.     cout << "Количество задач, у которых нет решения :\t" << notSol << endl;
  180.     cout << "Количество задач, у которых возникла ошибка при вычислении:\t" << errors << endl;
  181.  
  182.     cout << endl;
  183.     cout << "Статистика для каждого потока:" << endl;
  184.     cout << "Номер\t" << "Задач выполнено\t" << "Затреченное время\t" << "Минимальное\t" << "Максимальное" << endl;
  185.     for (int i = 0; i < threadCount; ++i) {
  186.         if (proces[i]->minT == MAXDWORD)
  187.             proces[i]->minT = 0;
  188.         if (proces[i]->maxT == -1)
  189.             proces[i]->maxT = 0;
  190.         cout << i + 1 << "\t" << proces[i]->solvedTasks << "\t\t" << proces[i]->time << "\t\t\t" << proces[i]->minT << "\t\t" << proces[i]->maxT << endl;
  191.     }
  192.  
  193.     cout << endl;
  194.    
  195.     cout << "Время, потраченное на решение вех задач и запись данных в файл: " << time << " милисекунд" << endl;
  196.     system("pause");
  197.     return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement