Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51

Объявление потока

26.11.2018, 21:06. Показов 2333. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, есть программа в которой я считываю информацию, из директории и в зависимости от того что в файле, произвожу вычисления (сложение умножение или сумма квадратов), но эти операции нужно выполнять в разных потоках
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
thread th2;
    if (doing == 2)   
    {
         th2([&summa,&vec]() {
           if (!summa)
           {
            summa++;
           }
        this_thread::sleep_for(chrono::milliseconds(4000));  //Имитация тяжелой задачи в 4 сек
        for (int i = 0; i < vec.size(); i++)
        {
            summa *= vec[i];
        }
        });
        
        }
        //Оставшийся текст программы
        th2.join();
Данную запись компилятор не принимает, написал по другому
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
thread th2;
    if (doing == 2)
    {
        thread th2([&summa,&vec]() {
            if (!summa)
            {
                summa++;
            }
            this_thread::sleep_for(chrono::milliseconds(4000));
            for (int i = 0; i < vec.size(); i++)
            {
                summa *= vec[i];
            }
            });
        th2.detach();      //Теперь программа не ждет этот поток, а завершает свою работу вместе с основным потоком
    }
Все работает, но теряется смысл потока, так как join() задерживает основной поток пока этот не выполнится, а используя detach() второстепенный поток не успеет завершить свою работу.

Добавлено через 1 минуту
Там вместо суммы произведение не не важно в принципе
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2018, 21:06
Ответы с готовыми решениями:

Вызывть метод одного потока из другого потока
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку : есть один поток(1), который вызывает метод у обьекта, этот...

Создание потока из потока.
Надо создать поток 1, в нем создать поток 2, сам я жуткий дураг, немаловероятно что правильного в коде вообще ничего нет ) ругается...

Два потока, две очереди, два потока
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные из своей очереди. Но когда одна из...

6
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2018, 21:09
Чем тебе join() мешает? Что этот основной поток делать-то будет?
0
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
26.11.2018, 21:19  [ТС]
Так ведь они тогда последовательно будут выполняться, насколько я понял join() приостанавливает поток в том месте где объявлен, а если я его объявлю в конце видимости программы, то когда деструктор будет разрушать объект thread вылетит ошибка

Добавлено через 2 минуты
Не так написал

Добавлено через 3 минуты
Если мы используем join(), то как я понял, он останавливает основной поток и дожидается выполнения второго потока, но его нужно объявлять по сути в конце программы, иначе они будут последовательно выполняться, но тогда я выйду за область видимости и будут ошибка
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2018, 21:19
Лучший ответ Сообщение было отмечено Mikelyndgelo как решение

Решение

У тебя вообще разные th2 получаются. Один сверху, а другой внутри if(). Так делай:
C++
1
2
3
4
thread th2;
    if (doing == 2)
    {
        th2 = std::thread([&summa,&vec]() {
А где-то в конце join().
1
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
26.11.2018, 21:41  [ТС]
Считает произведение элементов, не суть

Добавлено через 20 минут
Через раз вылетает ошибка, как только поток отрабатывает
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2018, 21:48
Показывай.
0
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
26.11.2018, 21:56  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<chrono>
#include<thread>
 
using namespace std;
 
int main()
{
    system("chcp 1251 >>null");
    srand(time(NULL));
    thread th1;
    while (true)
    {
        th1 = thread([]() {
            this_thread::sleep_for(chrono::milliseconds(3000));
            cout << "Готово" << endl;
        });
    }
    th1.join();
    return 0;
}
Написал отдельно тоже самое

Добавлено через 1 минуту
Не работает

Добавлено через 1 минуту
ой блииин

Добавлено через 47 секунд
Походу ошибка еще где-то, все работает, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2018, 21:56
Помогаю со студенческими работами здесь

объявление потока
С C# начал работать недавно(перехожу с Delphi на него). Глобально объявляю поток ThrUnZipToFtp: using System.Collections; ...

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200); По нажатию на кнопку из другого потока, нужно чтобы эти 2 потока...

Выполнение слота основного потока через сигнал второстепенного потока
Доброго времени суток! Вопрос следующий. В основном потоке создается кнопка и Qlabel class Ui_QtGuiApp4Class { public: //...

Не получается с вторичного потока обратиться напрямую к объекту из главного потока
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к объекту из главного потока. WPF пока...

Как из потока управлять формой, если функции потока находятся в другом классе?
Добрый вечер. Возник такой вопрос, никак не могу разобраться. Как из потока управлять формой, если функции потока находятся в другом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru