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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
10.03.2014, 21:28     Вызывть метод одного потока из другого потока #1
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку :

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от HardMorg Посмотреть сообщение
так что, подскажите?
смотрите в сторону событийно-ориентированного программирования
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 00:49  [ТС]     Вызывть метод одного потока из другого потока #9
Jupiter, а что собственно абстрактного? есть обработчик его нужно вызвать, только вызвать не в потоке который выполнял операцию а в том потоке который зарегистрировал этот обработчик
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
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::
Pure
 Аватар для 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;
}
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:10  [ТС]     Вызывть метод одного потока из другого потока #12
aLarman, это не то, тут первый поток знает о существовании еще потоков...

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

Не по теме:

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

ТС, имеет смысл конкретизировать Вашу задачу, тогда и советы будут более конструктивными и адаптированными для Вас
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
11.03.2014, 16:25  [ТС]     Вызывть метод одного потока из другого потока #15
Pure, смотрите
вот метод1 создает поток и ждет, а что если тут крутится цикл, который я не могу изменять, но в этом цикле есть евенты на какие-то действия, например на нажатия кнопк, когда нажимаю кнопку хендл этого события вызывается, но оно вызывается в рамках этого потока, значить этот поток зависает, тогда понтяно нужен еще поток, в котором и будет длительно обрабатывать, и вызвать хендл по окончанию, так вот этот хендл нужно вызвать в рамках первого потока
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
11.03.2014, 16:32     Вызывть метод одного потока из другого потока #16
Сама формулировка
Цитата Сообщение от HardMorg Посмотреть сообщение
нажимаю кнопку хендл этого события вызывается, но оно вызывается в рамках этого потока
по-моему ошибочна. Потоку в данный момент все равно нажимаете вы кнопку или нет (он просто выполняется), другой вопрос что ему надо как то передать информацию о нажатии, сделать это можно посредством глобальных переменных, с которыми и будет работать поток....
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2014, 16:36     Вызывть метод одного потока из другого потока #17
Цитата Сообщение от HardMorg Посмотреть сообщение
так вот этот хендл нужно вызвать в рамках первого потока
почему 1го? можно же 3ий создать
HardMorg
2 / 25 / 3
Регистрация: 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, а теперь хочу чтобы когда этот(второй поток) завершит свою работу вызвал метод(обработчик который ему передали) только в контексте первого потока,

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

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

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

Или воспользуйтесь поиском по форуму:
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
12.03.2014, 10:06  [ТС]     Вызывть метод одного потока из другого потока #20
Pure, просто GUI не я писал, и понятно что его изменить не могу, я с вами согласен вы правильно все говорите, но знаете хочется что-то новое сделать ))
на счет 3 пункта, я согласен на счет отдельных потоков так и делаю, но в итоге нужно это все синхронизировать, верно же? а так если бы можно было запускать обработчики операций ввода-вывода в потоке GUI то синхронизация не нужна
Yandex
Объявления
12.03.2014, 10:06     Вызывть метод одного потока из другого потока
Ответ Создать тему
Опции темы

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