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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: дедлок в сигналах/слотах?  (Прочитано 3743 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Май 27, 2010, 21:12 »

есть сложное приложение, содержащее много сигналов/слотов. В кратце - по даблклику на файле в списке мы через слот (тут queuedConnection) вызываем метод у класса на вершине некой иерархии, тот спускается вниз, вызывает метод open у некое класса, тот фейлится и кидает сигнал error()
Так вот, после испускания этого сигнала (иногда) вылетает такое сообщение в консоль:
Код:
QMutex::lock: Deadlock detected in thread 0x7fff70ff3be0 
Приложение естественно виснет.
Треды есть только кутешные, хз что и думать и куда копать.

аддед: треды:
мейн: qApp->thread() 0x101e085c0
перед ссигналом эррор: this->thread()        0x101e085c0
дедлок в треде:        0x7fff70ff3be0
что интересно - дедлокнутый тред сохраняется от запуска к запуску
« Последнее редактирование: Май 27, 2010, 21:21 от Авварон » Записан
ритт
Гость
« Ответ #1 : Май 27, 2010, 21:55 »

без кода сложно сказать что-нибудь наверняка. минимальный тесткейс в студию...

> что интересно - дедлокнутый тред сохраняется от запуска к запуску
попробуй между запусками запустить (и не грохать) фотошопу, например Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Май 27, 2010, 22:22 »

я вроде пофиксил убрав qApp->processEvents в слоте, соединенном с сигналом error()
тесткейз очень сложно сделать (хотя там всего 2 сигнала по идее) потому что его повторить проблематично (у меня он воспроизводится лихорадочным кликаньем на файл и жатием esc чтобы закрыть окошко с эррором).
Пока мысли такие, что небезопасно звать processEvents из слотов (??)
причем проверено - классы с сигналом в мейнтреде. Фича воспроизводится и в случае DirectConnection всех соединенй
Записан
ритт
Гость
« Ответ #3 : Май 28, 2010, 10:12 »

хех, это и подозревал.
достаточно просто должно быть воспроизвести на BlockingQueuedConnection
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Май 28, 2010, 10:49 »

про блокинг в доке написано что будет дедлок если объекты в одном треде (и это логично). Но у меня-то нет блокинг, у меня был директ (на самом деле авто, но объекты в 1м треде). Я специально убрал Queued вообще (он нужен чтобы обойти другой "баг")
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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