Russian Qt Forum

Qt => Общие вопросы => Тема начата: Авварон от Май 27, 2010, 21:12



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

аддед: треды:
мейн: qApp->thread() 0x101e085c0
перед ссигналом эррор: this->thread()        0x101e085c0
дедлок в треде:        0x7fff70ff3be0
что интересно - дедлокнутый тред сохраняется от запуска к запуску


Название: Re: дедлок в сигналах/слотах?
Отправлено: ритт от Май 27, 2010, 21:55
без кода сложно сказать что-нибудь наверняка. минимальный тесткейс в студию...

> что интересно - дедлокнутый тред сохраняется от запуска к запуску
попробуй между запусками запустить (и не грохать) фотошопу, например :)


Название: Re: дедлок в сигналах/слотах?
Отправлено: Авварон от Май 27, 2010, 22:22
я вроде пофиксил убрав qApp->processEvents в слоте, соединенном с сигналом error()
тесткейз очень сложно сделать (хотя там всего 2 сигнала по идее) потому что его повторить проблематично (у меня он воспроизводится лихорадочным кликаньем на файл и жатием esc чтобы закрыть окошко с эррором).
Пока мысли такие, что небезопасно звать processEvents из слотов (??)
причем проверено - классы с сигналом в мейнтреде. Фича воспроизводится и в случае DirectConnection всех соединенй


Название: Re: дедлок в сигналах/слотах?
Отправлено: ритт от Май 28, 2010, 10:12
хех, это и подозревал.
достаточно просто должно быть воспроизвести на BlockingQueuedConnection


Название: Re: дедлок в сигналах/слотах?
Отправлено: Авварон от Май 28, 2010, 10:49
про блокинг в доке написано что будет дедлок если объекты в одном треде (и это логично). Но у меня-то нет блокинг, у меня был директ (на самом деле авто, но объекты в 1м треде). Я специально убрал Queued вообще (он нужен чтобы обойти другой "баг")