Здравствуйте, kov_serg, Вы писали:
BFE>>
Если применять патерны C на С++, то так и получается.
BFE>>А вот если использовать нормальный патерн, вроде signal-slot или, там std::future / std::async / std::promise, то код будет выглядеть совсем иначе.
_>signal-slot как в qt забабахав предкомпиляцию, что бы весь треш спрятать под ковёр.
Не надо как в Qt. Qt отягощён своим наследием и к использованию совсем не обязателен. На современном C++ патерн signal-slot пишется за пару дней, если не заворачиваться со скоростью.
_>futute/promise никаких гарантий не дают и общаться с рабочим потоком прдётся через свои прослойки. Если можете показать как это элегантно сделать — покажите.
Да, через свои прослойки.
BFE>>Вариант, как вариант, видал я и позабористей. А вот то, что хорош — нет: если GUIWindow умрет раньше Workers, то это "всё", "падаем".
_>нет. Тут как раз при убийстве GUIWindow вызывается done он посылает всем работникам сигнал отмены,...
Из кода не видно, что это делается автоматически (например в деструкторе workers done() вызваться не может (т.е. может, но приведёт к падению)), так что скорее всего руками, а значит можно забыть прописать...
_>И все работники гарантировано освободят ресурсы, у них тоже довольно структурированный вид, и они не подозревают в каком потоке работают.
Что означает, что работники не могут одновременно работать на несколько окон.
_>Просто в C++ нет единообразия, для разных сущностей всё делается по своему.
Без микроменеджмента эффективности не будет. Где всё единообразно, там медленно.