Russian Qt Forum
Декабрь 24, 2024, 06:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Потоки при параллельном тестировании оборудования  (Прочитано 17183 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Август 22, 2012, 17:29 »

Давайте еще раз. Внутри метода run в наследнике QThread "завис" метод read из чужой dll. Завис тупо - без таймаутов и exception. Кто в этом случает сгенерит это самое исключение, которое потом будет передано через boost основному потоку?
Я сам (т.е. прерывающий зависание) напр в главной нитке. "Просто так" это ничего не даст потому что на др нити это никак не повлияет. Речь идет о механизме передачи exception в др нити.
Записан
Bepec
Гость
« Ответ #31 : Август 22, 2012, 19:12 »

Эмм.. Igors а зачем?

ТС же ясно сказал - тесты независимые. Каждый тест отдельная нить.
Если нить зависает, её надо прибить без последствий и выдать ошибку. Exception'ов внутри внешних вызовов нет. Виснет вся нить, что делать? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Август 22, 2012, 19:20 »

Эмм.. Igors а зачем?

ТС же ясно сказал - тесты независимые. Каждый тест отдельная нить.
Если нить зависает, её надо прибить без последствий и выдать ошибку. Exception'ов внутри внешних вызовов нет. Виснет вся нить, что делать? Улыбающийся
Знову за рибу грошi  Плачущий  Нет способа "прибить без последствий", но можно снять ее с ожидания передав ей exception "извне". Это совсем не ново, вот напр один клепал, правда под Вындоуз

http://www.codeproject.com/Articles/71529/Exception-Injection-Throwing-an-Exception-in-Other
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #33 : Август 23, 2012, 08:20 »

То есть, нужно придумать неких диспетчер потоков, который анализирует работоспособность (независшесть) каждой из нитей и в случае проблем с ней генерит для неё exception, "проталкивает" его внутрь нити, нить самостоятельно завершается, всё за собой подчищает и сообщает об этом диспетчеру. При этом основное приложение живёт нормальной жизнью.
Как-то уж больно заманчиво всё это выглядит, чтобы уже не быть реализованным в виде готового решения.

Что касается C++ 0x, то вот цитата от Страуструпа (там, вообще много интересного http://sergeyteplyakov.blogspot.com/2012/05/c-11-faq.html):
Не существует возможности запросить поток завершить исполнение (например, потребовать его завершиться как можно быстрее и насколько возможно безопасно), или принудительно прервать его исполнение (т.е. убить его). Мы оставили следующие возможности для реализации такого поведения:
- Разработать собственный механизм кооперативный отмены исполнения (с помощью разделяемых данных, вызывающий поток может установить значение, которое будет прочитано вызываемым потоком для быстрого и безопасного завершения),
- С помощью «нативного подхода» (получив доступ к дескриптору операционной системы с помощью thread::native_handle()),
- Завершить процесс (с помощью std::quick_exit()),
- Завершить программу (с помощью std::terminate()).
« Последнее редактирование: Август 23, 2012, 09:20 от xokc » Записан
Bepec
Гость
« Ответ #34 : Август 23, 2012, 09:27 »

Igors, а можно маленький примерчик с комментариями? В виде проекта допустим?

Очень уж заманчиво выглядит как бэ.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Август 23, 2012, 14:38 »

То есть, нужно придумать неких диспетчер потоков, который анализирует работоспособность (независшесть) каждой из нитей и в случае проблем с ней генерит для неё exception, "проталкивает" его внутрь нити, нить самостоятельно завершается, всё за собой подчищает и сообщает об этом диспетчеру. При этом основное
приложение живёт нормальной жизнью.
Именно. Все корректно/легально

Как-то уж больно заманчиво всё это выглядит, чтобы уже не быть реализованным в виде готового решения.
Дуст - вполне авторитетный источник. Эту ссылку я уже приводил, но наверное затерялась  Улыбающийся
http://www.boost.org/doc/libs/1_39_0/libs/exception/doc/tutorial_exception_ptr.html
Судя по первой фразе - реализовано. Дальше правда надо вникать тшательно, ну дело того стоит

Igors, а можно маленький примерчик с комментариями? В виде проекта допустим?

Очень уж заманчиво выглядит как бэ.
Не понял, а у кого правая рука Вындоуз, у Вас или меня? Ну вот Вам и карты в руки
http://msdn.microsoft.com/en-us/library/dd293602.aspx
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #36 : Август 24, 2012, 09:20 »

Дуст - вполне авторитетный источник. Эту ссылку я уже приводил, но наверное затерялась  Улыбающийся
Судя по первой фразе - реализовано. Дальше правда надо вникать тшательно, ну дело того стоит
Я немного другое имел ввиду. Хотелось бы видеть реализацию не пробрасывания exception из потока в поток, а весь функционал в виде готового "зависоустйчивого" диспетчера. Наверняка в рамках какого-нибудь из opensource проектов уже всё сделано.
« Последнее редактирование: Август 24, 2012, 12:29 от xokc » Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 22.