Advertisement
Andre1314

Untitled

Nov 3rd, 2022
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <vector>
  4. #include <string>
  5. #include <sstream>
  6. #include <fstream>
  7. #include <thread>
  8. #include <cmath>
  9.  
  10. using namespace std;
  11.  
  12. const int max_size = 1000;
  13.  
  14. HANDLE threads[max_size];
  15. vector<long double> threadsTime;
  16. int priority = 0;
  17.  
  18. vector<string> words; // all words
  19. vector<int> res; //max length values that every thread got
  20.  
  21. ifstream f;
  22. string fileName;
  23.  
  24. int num; // number of threads
  25. int n; //number of words
  26. int ml = 0; // max length of word
  27.  
  28. LONG volatile progressCounter = 0;
  29. double progressMax;
  30. bool isWorking = true;
  31.  
  32. HANDLE ghSemaphore;
  33.  
  34. struct thr {
  35.     int id;
  36.     int step;
  37. };
  38.  
  39. // знаходить найбільшу довжину слова зі всіх у масиві результатів
  40. void findMax() {
  41.     for (int i = 0; i < res.size(); i++) {
  42.         if (res[i] > ml)ml = res[i];
  43.     }
  44. }
  45. //записуємо результат
  46. void writeRes2() {
  47.     HANDLE file = CreateFile(TEXT(R"(C:\Users\BROS\source\repos\OSLab6\OSLab6\res.txt)"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  48.  
  49.     string res = "";
  50.     res += "Max length: " + to_string(ml) + '\n';
  51.  
  52.     for (int i = 0; i < threadsTime.size(); i++) {
  53.         cout << "Thread #" << i << " time: " << threadsTime[i] << '\n';
  54.     }
  55.     for (int i = 0; i < threadsTime.size(); i++) {
  56.         ostringstream strs;
  57.         strs << threadsTime[i];
  58.         string tT = strs.str();
  59.         res += "Thread #" + to_string(i) + " time: " + tT + '\n';
  60.     }
  61.  
  62.     const char* my_chars = res.c_str();
  63.  
  64.     HANDLE hMapping = CreateFileMapping(file, NULL, PAGE_READWRITE, 0, (strlen(my_chars) * sizeof(char)), NULL);
  65.  
  66.     LPSTR output = (LPSTR)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, (strlen(my_chars) * sizeof(char)));
  67.  
  68.     CopyMemory((LPVOID)output, (LPVOID)my_chars, (strlen(my_chars) * sizeof(char)));
  69.  
  70.     UnmapViewOfFile(output);
  71.     CloseHandle(hMapping);
  72.     CloseHandle(file);
  73. }
  74. // оскільки read2 повертає з файлу string, то цією функцією ми ту стрічку розділяємо на слова і тільки тоді запихуємо у масив
  75. void split(string s) {
  76.     char delim = ' ';
  77.     size_t start, end = 0;
  78.     while ((start = s.find_first_not_of(delim, end)) != string::npos) {
  79.         end = s.find(delim, start);
  80.         words.push_back(s.substr(start, end - start));
  81.     }
  82. }
  83. // зчитує файл
  84. void read2() {
  85.     string path = "C:\\Users\\BROS\\source\\repos\\OSLab6\\OSLab6\\" + fileName;
  86.  
  87.     wstring tmp = wstring(path.begin(), path.end());
  88.     const WCHAR* tmp2 = tmp.c_str();
  89.     LPCWSTR p = const_cast<LPCWSTR>(tmp2);
  90.  
  91.     HANDLE hFile = CreateFile(p, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  92.     HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
  93.     LPSTR input = (LPSTR)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
  94.  
  95.     split((string)input);
  96.  
  97.     UnmapViewOfFile(input);
  98.     CloseHandle(hMapping);
  99.     CloseHandle(hFile);
  100. }
  101. // вираховує кількість слів у файлі
  102. int numOfWords() {
  103.     ifstream file(fileName);
  104.  
  105.     int num = 0;
  106.     string w;
  107.     while (file >> w) {
  108.         num++;
  109.     }
  110.  
  111.     file.close();
  112.     return num;
  113. }
  114. // функція, яку виконує кожен потік
  115. DWORD WINAPI maxLen(LPVOID lpParameter) {
  116.     WaitForSingleObject(ghSemaphore, 0L);
  117.  
  118.     thr* d = (thr*)lpParameter;
  119.  
  120.     if (d->id < words.size()) {
  121.         chrono::steady_clock::time_point clockStart = chrono::steady_clock::now();
  122.  
  123.         res[d->id] = words[d->id].length();
  124.  
  125.         for (int i = d->id + d->step; i < words.size(); i += d->step) {
  126.             if (res[d->id] < words[i].length()) res[d->id] = words[i].length();
  127.  
  128.             InterlockedIncrement(&progressCounter);
  129.         }
  130.  
  131.         chrono::steady_clock::time_point clockEnd = chrono::steady_clock::now();
  132.  
  133.         chrono::steady_clock::duration timeSpan = clockEnd - clockStart;
  134.  
  135.         double nseconds = double(timeSpan.count()) * chrono::steady_clock::period::num / chrono::steady_clock::period::den;
  136.  
  137.         threadsTime[d->id] = nseconds;
  138.     }
  139.  
  140.  
  141.     ReleaseSemaphore(ghSemaphore, 1, NULL);
  142.  
  143.     ExitThread(0);
  144. }
  145. // функція для потоку, який показує нам прогрес
  146. DWORD WINAPI showProgress(LPVOID lpParameter) {
  147.     while (isWorking) {
  148.         cout.precision(3);
  149.         cout << progressCounter / progressMax * 100 << "%" << endl;
  150.  
  151.         int l = res[0];
  152.         for (int j = 0; j < res.size(); j++) {
  153.             if (l < res[j]) {
  154.                 l = res[j];
  155.             }
  156.         }
  157.  
  158.         if (l > 1) cout << "Len = " << l << endl;
  159.     }
  160.  
  161.     ExitThread(0);
  162. }
  163.  
  164. // створюємо потоки
  165. bool aThr(int count) {
  166.     n = words.size();
  167.     progressMax = words.size();
  168.  
  169.     const unsigned pCount = 1U * num;
  170.     res.resize(num, 0);
  171.     threadsTime.resize(num, 0);
  172.  
  173.     ghSemaphore = CreateSemaphore(NULL, count, count, NULL);
  174.     if (ghSemaphore == NULL) {
  175.         cout << "\nWe got a problem with the Semaphore\n\n";
  176.         return false;
  177.     }
  178.  
  179.     HANDLE progr = CreateThread(NULL, 0, showProgress, NULL, 0, 0);
  180.     if (progr == NULL) {
  181.         cout << "\nWe got a problem with the Progress Thread\n\n";
  182.         return false;
  183.     }
  184.  
  185.  
  186.     for (int i = 0; i < pCount; i++) {
  187.         thr* d = new thr;
  188.         d->id = i;
  189.         d->step = pCount;
  190.  
  191.         threads[i] = CreateThread(0, 0, maxLen, (LPVOID)d, 0, 0);
  192.     }
  193.  
  194.     SetThreadPriority(threads[0], priority);
  195.  
  196.     WaitForMultipleObjects(num, threads, TRUE, INFINITE);
  197.  
  198.     for (int i = 0; i < pCount; i++) {
  199.         WaitForSingleObject(threads[i], INFINITE);
  200.     }
  201.  
  202.  
  203.     for (DWORD i = 0; i < pCount; ++i) {
  204.         CloseHandle(threads[i]);
  205.     }
  206.  
  207.     isWorking = false;
  208.     WaitForSingleObject(progr, INFINITE);
  209.  
  210.     cout << "\nDone!\n";
  211.     return true;
  212. }
  213.  
  214. void changePriority() {
  215.     cout << "Time critical - 15\n";
  216.     cout << "Highest - 2\n";
  217.     cout << "Above normal - 1\n";
  218.     cout << "Normal - 0\n";
  219.     cout << "Below normal - -1\n";
  220.     cout << "Lowest - -2\n";
  221.     cout << "Idle - -15\n";
  222.     cin >> priority;
  223. }
  224.  
  225. int main()
  226. {
  227.     cout << "Number of threads: ";
  228.     cin >> num;
  229.  
  230.     int choice, maxCount = num;
  231.     cout << "Would you like to limit the number of threads working at the same time? Yes - 1, No - 0 | ";
  232.     cin >> choice;
  233.     if (choice == 1) {
  234.         cout << "Number of threads working at the same time: ";
  235.         cin >> maxCount;
  236.     }
  237.  
  238.     cout << "Would you like to change priority level of the first thread? Yes - 1, No - 0 | ";
  239.     cin >> choice;
  240.     if (choice == 1) changePriority();
  241.  
  242.     cout << "Name of file: ";
  243.     cin >> fileName;
  244.  
  245.     read2();
  246.  
  247.     if (aThr(maxCount)) {
  248.         findMax();
  249.         cout << "Max length: " << ml << endl;
  250.         writeRes2();
  251.     }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement