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

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

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

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

10.03.2014, 21:28. Просмотров 1884. Ответов 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++
Написать программу, содержащую два потока, каждый из которых управляет движением одного из двух шаров. Первый шар двигается горизонтально,...

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

вы спросите зачем мне это все, отвечаю при таком подходе не нужна будет синхронизация, если же ждать в первом потоке условную переменную то это снова все замирает, плюс цикл окна я не могу изменять
0
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 - только обработка очереди сообщений посылаемых окну и отображение инфы от других потоков. В случае асинхронных ос- вызовов - это все равно отдельные потоки, просто их ос создает сама.
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
12.03.2014, 10:06  [ТС] #20
Pure, просто GUI не я писал, и понятно что его изменить не могу, я с вами согласен вы правильно все говорите, но знаете хочется что-то новое сделать ))
на счет 3 пункта, я согласен на счет отдельных потоков так и делаю, но в итоге нужно это все синхронизировать, верно же? а так если бы можно было запускать обработчики операций ввода-вывода в потоке GUI то синхронизация не нужна
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2014, 10:56 #21
Цитата Сообщение от HardMorg Посмотреть сообщение
если бы можно было запускать обработчики операций ввода-вывода в потоке GUI то синхронизация не нужна
Запускайте. Кто ж Вам не дает. Только когда GUI будет подвешиваться, пеняйте на себя.
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
12.03.2014, 15:55  [ТС] #22
Tulosba, видно вы немного непоняли, не сами операции ввода-вывода и сеть, а только обработчики которые вызываются после выполнения этих операций
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2014, 16:03 #23
Цитата Сообщение от HardMorg Посмотреть сообщение
а только обработчики которые вызываются после выполнения этих операций
Дело тут в первую очередь в длительности операций, а не в том, как их назвать.
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
12.03.2014, 23:52  [ТС] #24
Tulosba, вы правы дело в длительности, саму операцию обрабатывать в одном потоке, а обработчик который нужно вызвать в первом потоке( сам обработчик легкий)
но мне так и не подсказали как так можно сделать( как я выше спрашивал)
сам я тоже в принципе ничего не не нашел, в бусте видел boost:coroutine, В принципе почти то что я искал, но он не поддерживает прижки между разными потоками
так что такие вот дела(
0
Jupiter
13.03.2014, 00:36
  #25

Не по теме:

тем временем в другой галактике C#

C#
1
2
3
4
5
6
7
//UI thread
async void SomeHandler()
{
    var content = await GetContentAsync();
 
    //work with content after async task finished
}
boost::coroutine как и самому с++ ещё грести и грести до такого, и не факт что выгребет

0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.03.2014, 15:40 #26
ересь чес слово.
1.где нужен результат обработки? например отобразить циферки в форме или заполнить форму данными из файла пришедшими по сети?
2. делаем функцию, которая будет обновлять формочку, соответственно у функции должен быть доступ к формочке.
3. При нажатии кнопки Апдейт - создаем поток и передаем в него указатель на эту функцию.
4. в конце потока, после получения данных из сети - дергаем этот указатель и формочка или оконце наполняется данными. Выходим из потока.

ВСЕ потоки в рамках ОДНОГО процесса имеют общее адресное пространство и общий доступ к ресурсам. Затем и придумали синхронизацию. Так в чем сложность то? Наплодить кучу потоков, передавать им указатели на обработчики и дергать эти обработчики перед выходом из потока?
Функция, ее определение - это просто кусочек памяти и обращаться к ней может любой поток.

Чтобы лучше понимать как работают монстры qt и прочие бусты, попробуй вначале просто нативно на API это все сделать. И все поймешь. Окошко, сокет, кнопка, функция обработчик текста окошка.
По нажатию кнопки - новый поток, соединение по сети запись чтение, вызов обработчика окошка, выход.

Уже сверху всего это наслаиваются классы и прочая мегаполезная прослойка, которая часто запутывает людей, но и здорово облегчает жизнь пользователям qt и буст.

Видимо ты не хош сам вникать. Таки скидывай весь код. Глядишь тебе кто то враз все поправит. Но все же я настаиваю на том, чтобы ты сам разобрался
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
14.03.2014, 16:18  [ТС] #27
Pure, простите, но видать вы просто не поняли что я хотел, то что вы написали это все ясно и понятно, суть не этом, я просто думал о другом подходе, про какой код вы говорите тоже не ясно, ничего мне кидать не нужно, в начале темы я другое писал, посмотритет что постил человек выше, вот реально на что-то похоже, но это шарп
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
14.03.2014, 23:09 #28
Цитата Сообщение от HardMorg Посмотреть сообщение
вы просто не поняли что я хотел
а сам четко понимаешь что хочешь? То, что юпитер написал в паре строк шарповского кода - лишь обертка над нативным апи. то бишь все даже еще на С работает, чего уж там. А на С++ подавно.
Цитата Сообщение от Jupiter Посмотреть сообщение
boost::coroutine как и самому с++ ещё грести и грести до такого, и не факт что выгребет
нативненько все отлично работает.
Ладно, удач и сбычи мечт всем
0
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
14.03.2014, 23:48  [ТС] #29
Pure, Вы снова явно что-то не так поняли, давайте по порядку, я в начале топика задал вопрос который как мне показалось имеет смысл, меня не поняли, я потом написал более развернутый вопрос, то что вы начали описывать, это я знал, суть темы сводилась не в перетертыванию старого, а мне было просто интересно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 23:48
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.03.2014, 23:48
Ответ Создать тему
Опции темы

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