Название: дедлок в сигналах/слотах? Отправлено: Авварон от Май 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 вообще (он нужен чтобы обойти другой "баг")
|