deadlock |
Здравствуйте, гость ( Вход | Регистрация )
deadlock |
zss |
24.6.2009, 15:00
Сообщение
#1
|
Участник Группа: Участник Сообщений: 112 Регистрация: 9.6.2009 Пользователь №: 815 Спасибо сказали: 0 раз(а) Репутация: 0 |
ситуация следующая.
Есть QMainWidow у которого есть потоковый метод. Он крутиться по флагу, вычитывает данные и посылает событие.
так вот иногда происходит висяк. Преположение в том, что customEvent для QMainWindow работает в первичном потоке и stop() тоже работает в первичном потоке. Так вот если я выставил флаг и жду, то первичный поток блокируется. В этот момент мой поток прочитал данные, и пытается послать событие. Может ли в данном случае быть deadlock или postEvent отработает всегда ? Если так, то где может быть висяк и как его разрулить ? |
|
|
zss |
24.6.2009, 16:15
Сообщение
#2
|
Участник Группа: Участник Сообщений: 112 Регистрация: 9.6.2009 Пользователь №: 815 Спасибо сказали: 0 раз(а) Репутация: 0 |
А тут висяк вполне может быть, если устройство с которого читаешь долго ничего не возвращает и до проверки твоего флага m_stopped дело не доходит. При этом естессно и гуй висит. ладно - тогда подробнее поток читает и посылает события. Он проверяет завершение на флаге. Первичный поток хочет его остановить. Он запускает поток, в котором выставляется флаг и ожидается завершение читающего потока. Но т.к. обработка событий в первичном потоке, то где-го висяк. Причем он не всегда. Пример
|
|
|
BRE |
24.6.2009, 16:31
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
поток читает и посылает события. Он проверяет завершение на флаге. Первичный поток хочет его остановить. Он запускает поток, в котором выставляется флаг и ожидается завершение читающего потока. Но т.к. обработка событий в первичном потоке, то где-го висяк. Причем он не всегда. А для чего такие сложности со вторым останавливающим потоком? Как мне кажется, тебе нужно сокращать время отклика потока для чтения, т.е. ты флаг остановки установил, этот поток должен завершиться как можно быстрее. Тогда и wait будет отрабатывать быстро, или не использовать wait, а ждать от потока сигнал finised? Тут от твоей задачи зависит.
Да, на sleep(1000) будет секундная задержка проверки флага. Здесь нужно что то придумать. Сообщение отредактировал BRE - 24.6.2009, 16:33 |
|
|
Текстовая версия | Сейчас: 22.12.2024, 19:08 |