Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 478
#1

Уведомления между потоками - C++

29.07.2015, 11:35. Просмотров 586. Ответов 24
Метки нет (Все метки)

Здравствуйте!
Набросал код для экспериментов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
 
int блок_1(HWND *hWnd, MyStruct* strukt_1);
int сервис_1(HWND *hWnd, MyStruct* strukt_1);
 
void блок(HWND *hWnd, MyStruct* strukt_1)//запускаем основной поток
{
    int q = 0;
    do
    {
        std::thread potok_блок_1(блок_1, hWnd, strukt_1);
        potok_блок_1.detach();//отсоединение потока
        std::thread potok_сервис_1(сервис_1, hWnd, strukt_1);
        potok_сервис_1.detach();//отсоединение потока
        ++q;
    }
    while ( q != 9 );
}
 
int блок_1(HWND *hWnd, MyStruct* strukt_1)//поток подключения
{   
    do
    {
        Sleep(1000);//10 сек
        (*strukt_1).a = 0;
    }
    while ( true );
    return 0;
}
 
int сервис_1(HWND *hWnd, MyStruct* strukt_1)//поток подключения
{
    do
    {
        Sleep(10);
        
    }
    while ( (*strukt_1).a != 0 );
    return 0;
}
Смысл такой, запускаю 20 фоновых потоков. теперь после каких-то вычислений какой либо из потоков блок_1 изменяет состояние в структуре. А в потоках сервис_1 жду этого изменения в цикле время от времени проверяя... Так вот вопрос в том, как избавится от этих циклов? чтобы не грузить систему. А остановить поток пока не будет сделано изменений в потоке блок_1.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 11:35     Уведомления между потоками
Посмотрите здесь:

Передача данных между потоками - C++
Есть сервер. Для каждого клиента он создает новый поток и работает с ними независимо от остальных...Например мне надо чтобы получив...

Отправка уведомления на e-mail - C++
Здравствуйте. Искал на форуме данную тему.Точнее есть коды на PHP и C# но я не понимаю как с ними работать. Не нашел на С++.Как же все таки...

Добавить вывода уведомления если стек полон или пуст - C++
Приветствую Столкнулся маленькой проблемкой. В код необходимо дописать строчки, чтобы выводило "Стек полон" и "Стек пуст", при “overflow”...

Работа с потоками - C++
Добрый вечер. Возникла такая проблема: в консольном приложении воспроизводится музыка при помощи mciSendString(s.c_str(), NULL, 0,...

Работа с потоками - C++
Задача поставлена так : Необходимо открыть поток, записать некую информацию и далее закрыть его. Но необходимо, чтобы после закрытия...

Работа с потоками - C++
Нужно посчитать сумму элементов в матрице nxn написал а она мне выдаёт ошибку. и теперь не знаю что надо делать. ...

проблема с потоками - C++
Ребят при написании программы появилась проблема, опишу вкратце. пишу интерфейс WTL шаблонами. В MainWindow класса есть метод обработки...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 478
30.07.2015, 07:30  [ТС]     Уведомления между потоками #21
Да при записи чтении этого массива структур в файл возникают ошибки...

C++
1
2
3
4
5
6
7
struct a
{
int a=1;
std::condition_variable cv;
}
 
std::vector<a> aa(10);
Добавлено через 5 минут
А записать этот массив в файл и потом прочитать можно будет? пробовал записать вектор выдает ошибку

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

Такой вопрос, как передать кондитион в функцию:
C++
1
2
3
4
5
std::condition_variable cv[10];
std::thread potok (клиент, &cv_klient);
potok.detach ();//отсоединение потока
 
void клиент (std::condition_variable *cv_klient);
Выдает ошибку:

Ошибка C2893 Сбой при специализации функции-шаблона "unknown-type std::invoke(_Callable &&,_Types &&...)" Сервер 3.01 d:\microsoft visual studio 14.0\vc\include\thr\xthread 238
Ilot
Модератор
Эксперт С++
1788 / 1163 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
30.07.2015, 07:41     Уведомления между потоками #22
Условные переменные
Цитата Сообщение от eagl69 Посмотреть сообщение
Такой вопрос, как передать кондитион в функцию:
Я же уже писал. У условных переменных нет конструкторов копирования/перемещения и операторов присвоения/перемещения.
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 478
30.07.2015, 07:58  [ТС]     Уведомления между потоками #23
А мьютекс передается без проблем...
void клиент (std::mutex *m_klient);

Добавлено через 11 минут
Да это я делал в консольном приложении...
Ilot
Модератор
Эксперт С++
1788 / 1163 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
30.07.2015, 07:58     Уведомления между потоками #24
Приведите пример кода. Гадалки в отпуске.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2015, 08:39     Уведомления между потоками
Еще ссылки по теме:

Работа с потоками - C++
Пишу простой RSS агрегатор и уже практически доделал его в программе параллельно устанавливается соединение и потом извлекаем данные из...

Работа с потоками - C++
Поток main должен выполнить следующие действия: создать массив, размерность и элементы которого вводятся пользователем с консоли; ...

работа с потоками - C++
Добрый вечер! Есть файл txt, состоит из символов, чисел, необходимо его открыть, упорядочить некоторым образом и записать, начал с...

Парсинг потоками - C++
Здравствуйте. У меня есть текстовый файл объёмом где-то 10-50 мегобайт. В нём в текстовом виде хранятся числа и строки в известном мне...

Работа с потоками - C++
Задание Разработать программу, реализующую многопочность средствами среды Win32. Программа должна обеспечивать: Отображение списка...


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

Или воспользуйтесь поиском по форуму:
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 478
30.07.2015, 08:39  [ТС]     Уведомления между потоками #25
C++
1
2
3
4
std::mutex m;
std::thread potok (клиент, &m);
potok.detach ();//отсоединение потока
void клиент (std::mutex *m);
В консольном приложении это работает...

Добавлено через 25 минут
В общем если все обернуть в массив то работает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct uvedomleniy
{
    std::condition_variable cv_klient;
    std::mutex mutex_klient;
};
 
std::vector<uvedomleniy> uvedomleniy_mob(кол_клиентов);
 
std::thread potok_клиент_моб (клиент_моб, &uvedomleniy_mob);
    potok_клиент_моб.detach ();//отсоединение потока
 
void клиент_моб ( std::vector<uvedomleniy> *uvedomleniy_mob);
Добавлено через 2 минуты
C++
1
2
3
4
(*uvedomleniy_mob)[nomer_strohki].cv_klient.notify_one();//отсылаем уведомление
 
std::unique_lock<std::mutex> lk((*uvedomleniy_mob)[nomer_strohki].mutex_klient);//останавливаем поток до принятия уведомления
(*uvedomleniy_mob)[nomer_strohki].cv_klient.wait(lk, [=]() { return (*база_Kient_mob)[nomer_strohki].статус_клиента[0] == 0; });//проверка пораметра по уведомлению
Yandex
Объявления
30.07.2015, 08:39     Уведомления между потоками
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru