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

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

Восстановить пароль Регистрация
 
 
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
29.07.2015, 11:35     Уведомления между потоками #1
Здравствуйте!
Набросал код для экспериментов:
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++ Работа с потоками
Работа с потоками. C++
C++ Работа с потоками
C++ проблема с потоками
C++ Работа с потоками
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
30.07.2015, 07:41     Уведомления между потоками #22
Условные переменные
Цитата Сообщение от eagl69 Посмотреть сообщение
Такой вопрос, как передать кондитион в функцию:
Я же уже писал. У условных переменных нет конструкторов копирования/перемещения и операторов присвоения/перемещения.
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
30.07.2015, 07:58  [ТС]     Уведомления между потоками #23
А мьютекс передается без проблем...
void клиент (std::mutex *m_klient);

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

Отправка уведомления на e-mail C++
Работа с потоками C++
C++ передача данных между потоками

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

Или воспользуйтесь поиском по форуму:
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
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     Уведомления между потоками
Ответ Создать тему
Опции темы

Текущее время: 20:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru