Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <thread>
- #include <vector>
- #include <future>
- #include <string>
- #include <random>
- #include <ctime>
- using namespace std;
- int main()
- {
- setlocale(LC_ALL, "Russian"); // русский язык в консоли
- cout << "Чтобы запустить процессы, нажмите Enter...";
- getchar();
- bool a = true; //чек завершения программы
- while (a) { //зациклить программу
- using fut_t = future<std::string>;
- vector<fut_t> threads; //вектор потоков
- auto is_future_valid = [](fut_t& fut) //указатель на функцию
- { //проверка, что поток действителен
- return fut.valid();
- };
- auto is_future_ready = [&is_future_valid](fut_t& fut) //проверка, что поток завершен
- {
- return is_future_valid(fut) && fut.wait_for(
- chrono::microseconds(100)) == future_status::ready;
- };
- srand(time(0));
- vector<int> tt;
- for (int i = 0; i < 5; i++) {
- tt.emplace_back(1 + rand() % 15);
- }
- for (int i = 0; i < 5; i++) {
- threads.emplace_back(async(launch::async, [tt,i] {
- this_thread::sleep_for(chrono::seconds(tt[i]));
- return string(to_string(i + 1) + "-й поток закончил свою работу...");
- }));
- }
- //пока есть хоть один не завершившийся поток
- while (any_of(threads.begin(), threads.end(), is_future_valid)) { // проверка, что какой-нибудь процесс завершился
- auto element = find_if(threads.begin(), threads.end(), is_future_ready); // находим готовый поток (получаем итератор)
- if (element == threads.end())
- {
- continue;
- }
- cout << element->get() << endl; // отмечаем конец процесса
- }
- cout << "Чтобы запустить процессы повторно, введите continue\nЧтобы выйти из программы, введите exit\n";
- string b;
- while (true) {
- cin >> b;
- if (b == "continue") {
- break;
- }
- else if (b == "exit") {
- a = false;
- break;
- }
- else {
- cout << "Вы ввели недопустимую команду, попробуйте снова:";
- }
- }
- }
- cout << "Программа завершена...";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement