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

Boost C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
#1

Остановка потока, в котором вызвана синхронная функция ввода вывода - Boost C++

09.01.2013, 22:15. Просмотров 2502. Ответов 23
Метки нет (Все метки)

Имется запущенный поток boost:thread. В нем вызван синхронная операция работы с портом read_some. Все работает хорошо до момента когда захочется этот поток завершить. Сейчас завершаю его мягким способом через join, но он в таком случае конечноже ждеть пока что-нибудь сможет прочитать.
Как посоветуете поступить с этим делом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 22:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Остановка потока, в котором вызвана синхронная функция ввода вывода (Boost C++):

Остановка рабочей функции потока - C++
День добрый. Задумался над таким вот вопросом. Допустим, у меня есть две функции get(StopObj obj) и process(StopObj obj). Эти две функции...

Контроль ввода-вывода потока - C#
Есть функция F которая работает в отдельном потоке и читает данные из stream. Когда стрим обращается за данными на диск, операционная...

Перегрузка ввода/вывода в/из потока - C++
Никогда потоками не пользовался, поэтому не знаю. Как перегрузить для ввода из потока оператор operator >>? Как перегрузить для вывода в...

Закрытие потока ввода/вывода - Java
Здравствуйте! Прошу не ругаться, если вопрос слишком простой и я отнял ваше время( Имеется метод InputString(), который считывает строку с...

Перегрузка потока ввода-вывода - C++
Подскажите как правильно перегружать потоки, вот что я делал и какие ошибки появились Как правильно перегружать потоки записи и чтения в...

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

23
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 17
09.01.2013, 22:37 #2
Цитата Сообщение от abutorin Посмотреть сообщение
Как посоветуете поступить с этим делом?
Думаю тут иначе нельзя ведь подвисание вызывает read_some() и внутрь её не залезть ведь так ?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 22:46  [ТС] #3
Технически это возможно (пересобрать boost после своих правок). Но идеалогически невозможно. Неужели нет способа прервать такой поток? Ведь если я не буду вызывать joinа просто попробую закрыть свою программу то она нормально вызовет все деструкторы и прервет все потоки.
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 17
09.01.2013, 22:48 #4
Блин нифига не понял о чем вы ... при чем тут boost ?

Приведите какой нибудь код....
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 22:56  [ТС] #5
Я использую библиотеку boost::asio для работы с последовательным портом и метод boost::asio::read_some_вызываю в обработчике потока(boost::thread).
Код очень громоздкий, писать синтетический вариант для примера долго. Вопрос простой, кто как поступает если в потоке используются синхронные методы и эти потоки необходимо останавливать.
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 17
09.01.2013, 23:00 #6
Цитата Сообщение от abutorin Посмотреть сообщение
Я использую библиотеку boost::asio для работы с последовательным портом и метод boost::asio::read_some
Только я чет не понимаю что за порт ? Что с asio можно работать с COM- портом ?

Может речь про сокет ?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 23:08  [ТС] #7
Только через него и может http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview.html.
Это вообщем-то неважно, с сокетом будут теже проблемы.Тут вопрос больше про синхронныеметоды чтения.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
COM- портом
Скорее последовательным портом, т.к. в NIX-ах нет com-портов. (програмка пишетля под линукс)
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 17
09.01.2013, 23:15 #8
Блин я чет туплю...

Реализуйте таймаут ... им и будет определятся время работы после команды завершить...

Добавлено через 4 минуты
http://myworkonly.blogspot.com/2012/04/timeout-serial-on-boost.html
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 23:22  [ТС] #9
По статье понял что готового решения нет и нужно делать собственное с использование асинхронного чтения. Если читать асинхронно то и проблемы моей не встанет.
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.01.2013, 09:47 #10
abutorin, Эм. А что мешает использовать async_read_*? Или же если так не хочется ждать завершения, detachнуть поток?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 10:15  [ТС] #11
ForEveR, ничем не мешает, просто я думал есть штатная возможность. Как например в случае засыпания потока через boost:sleep его можно прервать штатными средствами без ожидания завершения.
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.01.2013, 10:31 #12
abutorin, Ну так-то можно не join ведь вызывать, а timed join.

C++
1
2
3
4
    template <class Rep, class Period>
    bool try_join_for(const chrono::duration<Rep, Period>& rel_time); // EXTENSION
    template <class Clock, class Duration>
    bool try_join_until(const chrono::time_point<Clock, Duration>& t); // EXTENSION
C++
1
2
3
4
5
#if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0 || defined BOOST_THREAD_DONT_USE_CHRONO
    bool timed_join(const system_time& wait_until);
    template<typename TimeDuration>
    bool timed_join(TimeDuration const& rel_time);
#endif
http://www.boost.org/doc/libs/1_52_0...agement.thread
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 10:53  [ТС] #13
ForEveR, думаю timed_join здесь может подойти. Хотя для надежности асинхронные методы исопльзовать похоже будет корректнее. Как я понимаю timed_join это всеже кардинальный метод завершения потока.
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 17
10.01.2013, 16:12 #14
Цитата Сообщение от abutorin Посмотреть сообщение
timed_join это всеже кардинальный метод завершения потока.
чЁ ?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 16:37  [ТС] #15
Да, несовсем корректно перевел. Не кардинальный способ. Вообщем понял что стоит в данном случае использовать асинхронные методы.
0
10.01.2013, 16:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 16:37
Привет! Вот еще темы с ответами:

Передача потока ввода/вывода в функцию - C++ Builder
Нужно перегрузить оператор ввода и вывода. С перегрузкой проблем не возникало до этого момента. Есть класс. #include &lt;iostream&gt; ...

Переключение файлового потока ввода вывода - C++
Есть прога. Если закоментить первый цикл то будет читать из файла, если второй то будет его писать. Теперь вопрос: как её заставить делать...

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

Чтение байтов из потока файлового ввода-вывода - C#
Никогда не работал в командной строке. Подскажите как с помощью программы считать данные из файла. using System; using...


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

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

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