Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
1

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

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

Author24 — интернет-сервис помощи студентам
Имется запущенный поток boost:thread. В нем вызван синхронная операция работы с портом read_some. Все работает хорошо до момента когда захочется этот поток завершить. Сейчас завершаю его мягким способом через join, но он в таком случае конечноже ждеть пока что-нибудь сможет прочитать.
Как посоветуете поступить с этим делом?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2013, 22:15
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

Добавлено через 4 минуты
http://myworkonly.blogspot.com... boost.html
0
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 23:22  [ТС] 9
По статье понял что готового решения нет и нужно делать собственное с использование асинхронного чтения. Если читать асинхронно то и проблемы моей не встанет.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2013, 09:47 10
abutorin, Эм. А что мешает использовать async_read_*? Или же если так не хочется ждать завершения, detachнуть поток?
0
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 10:15  [ТС] 11
ForEveR, ничем не мешает, просто я думал есть штатная возможность. Как например в случае засыпания потока через boost:sleep его можно прервать штатными средствами без ожидания завершения.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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/... ent.thread
0
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 10:53  [ТС] 13
ForEveR, думаю timed_join здесь может подойти. Хотя для надежности асинхронные методы исопльзовать похоже будет корректнее. Как я понимаю timed_join это всеже кардинальный метод завершения потока.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.01.2013, 16:12 14
Цитата Сообщение от abutorin Посмотреть сообщение
timed_join это всеже кардинальный метод завершения потока.
чЁ ?
0
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 16:37  [ТС] 15
Да, несовсем корректно перевел. Не кардинальный способ. Вообщем понял что стоит в данном случае использовать асинхронные методы.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.01.2013, 16:43 16
Ну так что синхронном режиме разве не предусмотрены таймауты ?

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
abutorin, Эм. А что мешает использовать async_read_*? Или же если так не хочется ждать завершения, detachнуть поток?
Кстати detach как я понимаю это грубое завершение, типа TerminatedThread() на уровне WinApi ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2013, 16:58 17
Avazart, Эм. Нет. TerminateThread судя по описанию просто убивает поток, а detach отпускает поток в свободное плавание.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.01.2013, 17:01 18
Цитата Сообщение от ForEveR Посмотреть сообщение
отпускает поток в свободное плавание
Это как ? Честно говоря не понимаю ... тобиш он продолжает работать и может изменять данные ( ну и память под него занята ) ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2013, 17:15 19
Avazart, Что делает join? Поток вызвавший данную функцию ожидает окончания работы потока на котором вызвана заданная функция. detach же просто отпускает второй поток в свободное плавание, т.е. поток продолжает работать, но к нему больше нет никакого доступа через объект типа boost::thread, однако при завершении главного потока относительно этого потока - умрет. Пример чуть позже приложу.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.01.2013, 18:06 20
Цитата Сообщение от ForEveR Посмотреть сообщение
однако при завершении главного потока относительно этого потока - умрет.
Ну так при завершении приложения(основного потока) с "отсоединенным потоком" и будет вызван TerminatedThread так как мягко его уже завершить нельзя.
0
10.01.2013, 18:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2013, 18:06
Помогаю со студенческими работами здесь

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

Передача потока ввода/вывода в функцию
Нужно перегрузить оператор ввода и вывода. С перегрузкой проблем не возникало до этого момента....

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru