0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
|
|
1 | |
Остановка потока, в котором вызвана синхронная функция ввода вывода09.01.2013, 22:15. Показов 4144. Ответов 23
Метки нет (Все метки)
Имется запущенный поток boost:thread. В нем вызван синхронная операция работы с портом read_some. Все работает хорошо до момента когда захочется этот поток завершить. Сейчас завершаю его мягким способом через join, но он в таком случае конечноже ждеть пока что-нибудь сможет прочитать.
Как посоветуете поступить с этим делом?
0
|
09.01.2013, 22:15 | |
Ответы с готовыми решениями:
23
Закрытие потока ввода/вывода Перегрузка потока ввода-вывода Контроль ввода-вывода потока Перегрузка ввода/вывода в/из потока |
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
|
|
09.01.2013, 22:46 [ТС] | 3 |
Технически это возможно (пересобрать boost после своих правок). Но идеалогически невозможно. Неужели нет способа прервать такой поток? Ведь если я не буду вызывать joinа просто попробую закрыть свою программу то она нормально вызовет все деструкторы и прервет все потоки.
0
|
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
|
|
09.01.2013, 22:56 [ТС] | 5 |
Я использую библиотеку boost::asio для работы с последовательным портом и метод boost::asio::read_some_вызываю в обработчике потока(boost::thread).
Код очень громоздкий, писать синтетический вариант для примера долго. Вопрос простой, кто как поступает если в потоке используются синхронные методы и эти потоки необходимо останавливать.
0
|
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
|
|
09.01.2013, 23:08 [ТС] | 7 |
Только через него и может http://www.boost.org/doc/libs/... rview.html.
Это вообщем-то неважно, с сокетом будут теже проблемы.Тут вопрос больше про синхронныеметоды чтения. Добавлено через 1 минуту Скорее последовательным портом, т.к. в NIX-ах нет com-портов. (програмка пишетля под линукс)
0
|
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.
0
|
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
|
|
10.01.2013, 10:53 [ТС] | 13 |
ForEveR, думаю timed_join здесь может подойти. Хотя для надежности асинхронные методы исопльзовать похоже будет корректнее. Как я понимаю timed_join это всеже кардинальный метод завершения потока.
0
|
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
|
|
10.01.2013, 16:37 [ТС] | 15 |
Да, несовсем корректно перевел. Не кардинальный способ. Вообщем понял что стоит в данном случае использовать асинхронные методы.
0
|
10.01.2013, 16:43 | 16 |
Ну так что синхронном режиме разве не предусмотрены таймауты ?
Добавлено через 3 минуты Кстати detach как я понимаю это грубое завершение, типа TerminatedThread() на уровне WinApi ?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
10.01.2013, 16:58 | 17 |
Avazart, Эм. Нет. TerminateThread судя по описанию просто убивает поток, а detach отпускает поток в свободное плавание.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
10.01.2013, 17:15 | 19 |
Avazart, Что делает join? Поток вызвавший данную функцию ожидает окончания работы потока на котором вызвана заданная функция. detach же просто отпускает второй поток в свободное плавание, т.е. поток продолжает работать, но к нему больше нет никакого доступа через объект типа boost::thread, однако при завершении главного потока относительно этого потока - умрет. Пример чуть позже приложу.
1
|
10.01.2013, 18:06 | 20 |
Ну так при завершении приложения(основного потока) с "отсоединенным потоком" и будет вызван TerminatedThread так как мягко его уже завершить нельзя.
0
|
10.01.2013, 18:06 | |
10.01.2013, 18:06 | |
Помогаю со студенческими работами здесь
20
Перегрузка потока ввода вывода в dll Передача потока ввода/вывода в функцию Переключение файлового потока ввода вывода Чтение байтов из потока файлового ввода-вывода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |