Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
1

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

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

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

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

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

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

Запуск метода из другого потока
Здравствуйте, начал интересоваться потоками , передаю из 1 потока указатель на...

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

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

Как передать данные из одного потока в другой?
Есть отдельный поток для чтения данных и основной поток для обработки данных....

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

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

Добавлено через 1 минуту
Цитата Сообщение от HardMorg Посмотреть сообщение
так что, подскажите?
смотрите в сторону событийно-ориентированного программирования
0
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 00:49  [ТС] 9
Jupiter, а что собственно абстрактного? есть обработчик его нужно вызвать, только вызвать не в потоке который выполнял операцию а в том потоке который зарегистрировал этот обработчик
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 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 / 7
Регистрация: 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 / 9
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:10  [ТС] 12
aLarman, это не то, тут первый поток знает о существовании еще потоков...

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

Не по теме:

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

ТС, имеет смысл конкретизировать Вашу задачу, тогда и советы будут более конструктивными и адаптированными для Вас
0
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:25  [ТС] 15
Pure, смотрите
вот метод1 создает поток и ждет, а что если тут крутится цикл, который я не могу изменять, но в этом цикле есть евенты на какие-то действия, например на нажатия кнопк, когда нажимаю кнопку хендл этого события вызывается, но оно вызывается в рамках этого потока, значить этот поток зависает, тогда понтяно нужен еще поток, в котором и будет длительно обрабатывать, и вызвать хендл по окончанию, так вот этот хендл нужно вызвать в рамках первого потока
0
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
11.03.2014, 16:32 16
Сама формулировка
Цитата Сообщение от HardMorg Посмотреть сообщение
нажимаю кнопку хендл этого события вызывается, но оно вызывается в рамках этого потока
по-моему ошибочна. Потоку в данный момент все равно нажимаете вы кнопку или нет (он просто выполняется), другой вопрос что ему надо как то передать информацию о нажатии, сделать это можно посредством глобальных переменных, с которыми и будет работать поток....
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
11.03.2014, 16:36 17
Цитата Сообщение от HardMorg Посмотреть сообщение
так вот этот хендл нужно вызвать в рамках первого потока
почему 1го? можно же 3ий создать
0
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:43  [ТС] 18
mustimur, хорошо конкретизирую, попробую просто
есть окно, есть основной цикл, который обновляет это окно,
в окне есть кнопки, на кнопки вешают обработчики,
по мимо всего этого использую boost::asio, кто ее использовал знают про метод boost::asio::io_service::run

так вот например есть кнопка подключиться к серверу
по ее нажатию вызывается обработчик(метод) который создает обьект класса отвечающий за подключения
на этом обьекте я async_connect и передаю туда снова обработчик

псевдокод

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
handle_server(AsyncTCPClient* client) {
  
   client->getState();
   ....
 
   ... 
}
 
 
handle_event_connect {
   AsyncTCPClient * client;
   client->async_connect(....., std::bind(handle_server, cclient));
}
обработчик вызывается и смотрим текущее состояние, в зависимости от состояния выбираем дальнейшие действия

например, удалось подключиться
теперь я вешаю обработчик на кнопку которая отвечает за получение данных, когда я ее нажимаю, я снова передаю фукнцию которую нужно будет вызвать внутри AsyncTCPClient когда тот получит или нет данные, но сервер может долго обрабатывать и зависнет все на методе run, но мне не нужно чтобы обработка главного окна замирала, по этому я внутри AsyncTCPClient создавал новый поток, в который замирал на методе run, а теперь хочу чтобы когда этот(второй поток) завершит свою работу вызвал метод(обработчик который ему передали) только в контексте первого потока,

вы спросите зачем мне это все, отвечаю при таком подходе не нужна будет синхронизация, если же ждать в первом потоке условную переменную то это снова все замирает, плюс цикл окна я не могу изменять
0
Pure
228 / 49 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.03.2014, 23:14 19
Цитата Сообщение от HardMorg Посмотреть сообщение
Pure, смотрите
вот метод1 создает поток и ждет, а что если тут крутится цикл, который я не могу изменять, но в этом цикле есть евенты на какие-то действия, например на нажатия кнопк, когда нажимаю кнопку хендл этого события вызывается, но оно вызывается в рамках этого потока, значить этот поток зависает, тогда понтяно нужен еще поток, в котором и будет длительно обрабатывать, и вызвать хендл по окончанию, так вот этот хендл нужно вызвать в рамках первого потока
действительно лучше описывать более точно задачу. Тот код который я накидал - решает твое ТЗ на 100%. Но как выясняется ТЗ было не полным. На то она и есть письменная речь, чтобы упорядочить кашу и тезисно накидать чего нужно.
Исходя из всего что написано могу дать пару советов.
1. GUI - кнопочки, формочки и прочее делаем либо нативно (что грех) либо на QT - там тебе все будет и асинхронность и прочее прочее прочее под твои задачи с серером, обработчиками и кнопочкой.
2. Буст не следует использовать при написании GUI и обработки оного - это котлеты с мухами.
3. Если все пишешь сам - есть выведенное правило - никогда в потоке GUI не обрабатывай длительные операции ввода вывода. Обработка сетевых соеднений, записи в файлы и прочее - отдельные потоки. GUI - только обработка очереди сообщений посылаемых окну и отображение инфы от других потоков. В случае асинхронных ос- вызовов - это все равно отдельные потоки, просто их ос создает сама.
0
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
12.03.2014, 10:06  [ТС] 20
Pure, просто GUI не я писал, и понятно что его изменить не могу, я с вами согласен вы правильно все говорите, но знаете хочется что-то новое сделать ))
на счет 3 пункта, я согласен на счет отдельных потоков так и делаю, но в итоге нужно это все синхронизировать, верно же? а так если бы можно было запускать обработчики операций ввода-вывода в потоке GUI то синхронизация не нужна
0
12.03.2014, 10:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 10:06

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

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

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


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

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

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