Russian Qt Forum

Разное => Говорилка => Тема начата: Sancho_s_rancho от Май 30, 2011, 09:03



Название: Порядок вызова слотов при испускании сигнала.
Отправлено: Sancho_s_rancho от Май 30, 2011, 09:03
Листал я на досуге документацию по qt 4.7, и наткнулся ненароком на такой абзац
Цитировать
If several slots are connected to one signal, the slots will be executed one after the other, in the order they have been connected, when the signal is emitted.

"Фига" - подумал я. Вроде ж он не определен, этот порядок. Открыл документацию к 4.5:
Цитировать
If several slots are connected to one signal, the slots will be executed one after the other, in an arbitrary order, when the signal is emitted.

Зачем к концу жизненного цикла четвертой ветки они этот порядок установили?


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: SASA от Май 30, 2011, 09:45
Я думаю порядок был всегда. Но пользоваться этим порядком не есть правильно. Вот они и писали, что в случайном.
А теперь признались  :D


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: Akon от Май 30, 2011, 09:52
Чтоб уменьшить энтропию продукта :)


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: Sancho_s_rancho от Май 30, 2011, 10:03
Чтоб уменьшить энтропию продукта :)
Разработчик использовал версию 4.7, а дистроклепатели более раннюю. Если какого-то метода нет в ранней версии, то программа просто не соберется. С этим же подходом все может успешно собраться и запустится и наделать бед в рантайме.
Да, конечно, разработчик может жирный варнинг в pro добавить. Но мы же знаем этих разработчиков ;) . Да и никто не гарантирует, что он начинал изучение Qt c с дремучих версий и в курсе что надо кого-то о чем-то предупреждать.


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: Sancho_s_rancho от Май 30, 2011, 10:09
Я думаю порядок был всегда. Но пользоваться этим порядком не есть правильно. Вот они и писали, что в случайном.
А теперь признались  :D
Общество анонимных Qt-шников.

В течение пяти лет я и мои коллеги девелоперы Qt знали и использовали порядок connect для установления порядка вызова слотов. Мы не рассказывали об этом никому. Обманывали своих жен, детей и даже пользователей платных версий Qt. Но мы не может более держать это в тайне. Пусть все знают эту горькую правду - этот порядок есть.


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: Akon от Май 30, 2011, 15:04
Цитировать
Разработчик использовал версию 4.7, а дистроклепатели более раннюю. Если какого-то метода нет в ранней версии, то программа просто не соберется. С этим же подходом все может успешно собраться и запустится и наделать бед в рантайме.
Скорее наоборот, если бы полагались на порядок, а в новой версии его бы не стало.

В общем случае в многопоточной среде толку от порядка нет, поскольку без специальных ухищрений вы не сможете выполнить соединения сигнал-слот в определенном порядке.


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: lit-uriy от Июнь 01, 2011, 13:57
Цитировать
Изучив немного посты в mailist'e trolltech я вынесл для себя следующую мысль. На данный момент порядок вызовов слотов можно предсказать, однако разработчики не дают гарантии того, что в новых версиях библиотеки порядок вызовов не изменится. Может быть вариант, когда вызовы будут сортироваться для достижения максимальной производительности. Поэтому, если нужен строгий порядок вызовов слотов...
тыц (http://www.forum.crossplatform.ru/index.php?showtopic=981&view=findpost&p=19452)


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: LisandreL от Июнь 01, 2011, 14:30
В течение пяти лет я и мои коллеги девелоперы Qt знали и использовали порядок connect для установления порядка вызова слотов. Мы не рассказывали об этом никому. Обманывали своих жен, детей и даже пользователей платных версий Qt. Но мы не может более держать это в тайне. Пусть все знают эту горькую правду - этот порядок есть.
Обычно когда что-то задокументировано как «undefined», но разработчики «знали и использовали», заканчивается очень трудно отлавливаемыми багами, когда это всё же поменяется или просто перейдёте на другой компилятор, где это работает не так: поучительная история (http://habrahabr.ru/blogs/development/116468/).


Название: Re: Порядок вызова слотов при испускании сигнала.
Отправлено: ритт от Июнь 05, 2011, 17:38
о, да, поучительная история о том, как торвальдз даёт мастер-класс толстого троллинга...

если перейдёте на другой компилятор, то вызов слотов там будет точно такой же.