Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
#1

Вызывть метод одного потока из другого потока - C++

10.03.2014, 21:28. Просмотров 2384. Ответов 28
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку :

есть один поток(1), который вызывает метод у обьекта, этот метод создает второй поток(2) и в новом потоке(2) что-то делает, потом по окончанию своей работы(2 - поток), нужно вызвать метод который выполнился б уже в первом(1) потоке, тоесть второй поток впихивает метод в первый.

Вообщем можно ли такое?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2014, 21:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызывть метод одного потока из другого потока (C++):

Запуск потока из другого приложения - C++
Подскажите как запустить/остановить, приостановить/возобновить поток одного процесса из другого?

Потоки, static. Доступ к полю класса из другого потока - C++
Добрый день! Суть: имею программу, в ней есть класс server, который содержит в себе поле session sessions, в определённый момент...

Как прочитать данные из потока вывода другого процесса - C++
Как получить то, что выводит командная строка (прочитать выводной поток другого процесса)

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

Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? - C++
Начать с массивов, допустим То есть ситуация такая: пусть имеется два потока и глобальный массив элементов int из двух элементов, один...

Написать программу, содержащую два потока, каждый из которых управляет движением одного из двух шаров - C++
Написать программу, содержащую два потока, каждый из которых управляет движением одного из двух шаров. Первый шар двигается горизонтально,...

28
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.03.2014, 21:41 #2
возможно
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
10.03.2014, 21:53  [ТС] #3
Jupiter, как? желательно без всяких блокировок
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.03.2014, 22:12 #4
Цитата Сообщение от HardMorg Посмотреть сообщение
как?
зависит от того что используется
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
10.03.2014, 22:14  [ТС] #5
Jupiter, в каком смысле?
вы про буст?
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
10.03.2014, 22:39 #6
Цитата Сообщение от HardMorg Посмотреть сообщение
тоесть второй поток впихивает метод в первый.
наитупейший случай: второй поток устанавливает некий флаг, в первом потоке он анализируется и выполняется тот или иной метод.
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 00:08  [ТС] #7
Tulosba, нет, это не подходит, так как первый поток должен знать про второй, а мне нужно что бы для первого потока все было прозрачно, он не должен знать про второй

Добавлено через 27 минут
Jupiter, так что, подскажите?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.03.2014, 00:36 #8
Цитата Сообщение от HardMorg Посмотреть сообщение
в каком смысле?
в прямом, я даю абстрактный ответ на ваш абстрактный вопрос

Добавлено через 1 минуту
Цитата Сообщение от HardMorg Посмотреть сообщение
так что, подскажите?
смотрите в сторону событийно-ориентированного программирования
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 00:49  [ТС] #9
Jupiter, а что собственно абстрактного? есть обработчик его нужно вызвать, только вызвать не в потоке который выполнял операцию а в том потоке который зарегистрировал этот обработчик
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 1
11.03.2014, 13:19 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
condition_variable var;
std::mutex mut;
class A
{
void method1()//этот метод будет выполнятся в 1ом потоке
{
//что то делаем
var.notify_one();
}
void method2()
{
std::unique_lock<std::mutex> loker(mut);
var.wait(loker);// вот тут поток 1 зависнет и будет ждать вызова notify_one
//что то делаем
}
}
int main()
{//это первый поток
A object;
std::thread thread1(&A::method1, std:ref(object));//создаем поток 2
object.method2();//вызов метода из 1го потока но он не выполнится пока 1ый поток не закончится
return 0;
}
если я Вас правильно понял

Добавлено через 1 минуту
или еще проще....что то я загнул в условными переменными
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
void method1()//этот метод будет выполнятся в 1ом потоке
{
//что то делаем
}
void method2()
{
 
//что то делаем
}
}
int main()
{//это первый поток
A object;
std::thread thread1(&A::method1, std:ref(object));//создаем поток 2
thread1.join();//ждем завершение потока 2(выхода из ф-ции method1)
object.method2();
return 0;
}
Добавлено через 3 минуты
11ый стандарт, можно тоже самое с boost, заменить std:: на boost::
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.03.2014, 14:45 #11
Все верно предыдущий оратор написал ток чутка отклонился от задачи. вызванный метод должен создать поток. Ну и далее по заданию.
Ни на какой буст ничего заменять не советую. Лучше пользоваться стандартом 11
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
#include <iostream>
#include <thread>
 
class A
{
public:
    void method1()
    {
        std::cout<<"Start thread 1\n";
        std::thread t2([](){std::cout<<"Start thread 2 and do some from thread 2\n";});
        t2.join();
 
        std::cout<<"Now return from thread 2, and call method from thread 1\n";
        method2();
    }
 
    void method2()
    {
        std::cout<<"Method2 from thread 1\n";
    }
 
};
 
int main()
{
A object;
 
    std::thread t1(&A::method1, std::ref(object));
    t1.join();
    return 0;
}
1
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:10  [ТС] #12
aLarman, это не то, тут первый поток знает о существовании еще потоков...

мне нужно чтобы второй поток запустил функцию в контексте первого
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 1
11.03.2014, 16:16 #13
Цитата Сообщение от HardMorg Посмотреть сообщение
окончанию своей работы(2 - поток), нужно вызвать метод который выполнился б уже в первом(1) потоке
Цитата Сообщение от HardMorg Посмотреть сообщение
мне нужно чтобы второй поток запустил функцию в контексте первого
а нужел ли Вам вообще 2ой поток? может это можно сделать в 1ом, раз уж никакой параллельности вычислений не наблюдается
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
11.03.2014, 16:24 #14
Цитата Сообщение от aLarman Посмотреть сообщение
а нужел ли Вам вообще 2ой поток? может это можно сделать в 1ом, раз уж никакой параллельности вычислений не наблюдается
Вот это я и хотел озвучить, линейный алгоритм, поток ждет второй...

Не по теме:

Извините сложилась впечатление, что задача выглядит так: есть поток "внучок" который бежит всегда вперед потока "бабушка" открывает дверь ему, а затем ждет пока "бабушка" пройдет и снова вперед, хотя и "бабушка" будет ждать "внучка", чтобы тот ей открыл дверь.....

ТС, имеет смысл конкретизировать Вашу задачу, тогда и советы будут более конструктивными и адаптированными для Вас
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:25  [ТС] #15
Pure, смотрите
вот метод1 создает поток и ждет, а что если тут крутится цикл, который я не могу изменять, но в этом цикле есть евенты на какие-то действия, например на нажатия кнопк, когда нажимаю кнопку хендл этого события вызывается, но оно вызывается в рамках этого потока, значить этот поток зависает, тогда понтяно нужен еще поток, в котором и будет длительно обрабатывать, и вызвать хендл по окончанию, так вот этот хендл нужно вызвать в рамках первого потока
0
11.03.2014, 16:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2014, 16:25
Привет! Вот еще темы с ответами:

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

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

Перенаправление потока - C++
Мне нужно получить список файлов в директории и перенаправить поток в текстовый файл. Отдельно перенаправить поток и получить список файлов...

Очистка потока - C++
Приветствую! Есть метод класса, принимающий имя сотрудника (объект класса string) и его номер: void Employee::setData() { ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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