Всем привет.
На форуме некоторое время назад был флейм по поводу, что лучше для определения когда у наблюдаемого объекта сменилось состояние: использовать Callback-и или периодически опрашивать объект.
У Callback-ов есть имхо 2 самых главных недостатка:
При удалении наблюдателя, Callback может быть вызван для уже несуществующего объекта
Частенько очень глубокий call stack, когда Callback вызывается. Бывает очень трудно провернуть различные манипуляции с уничтожениями объектов, изменений их состояний и т.д..
Первая проблема легко решается использованием boost::signals (заодно он позволяет использовать "перегрузку" callback-ов) вместе с boost::signals::trackable (ну или велосипедом).
А вот по второй, у меня вопрос.
Что если вызов callback-а отвязать от момента собственно происхождения события? Т.е. в момент события, callback не вызывать, а складывать его функтор в некий стек, который может быть вызван позднее, в более безопасное время.
Например.
while(1)
{
//.. длиинные операции (обработка нажатий на кнопки, сетевые сообщения и прочее)
//.. неявно наполняем callback_queue
...
//.. вызываем все отложенные callback-и
callback_queue.run();
//.. чистим
callback_queue.clear();
}
По сути это смена синхронного вызова callback-а на асинхронный.
Чем может быть опасен глобальный переход с синхронных callback-ов на асинхронные для целого проекта? В случае если очерёдность вызовов будет сохранена. И в чём этот способ может проигрывать периодическому опросу наблюдаемого объекта?
Просто я сейчас не могу придумать ни одной потенциальной проблемы, и стою перед выбором, явно специфицировать способ вызова в месте подписки на событие или неявно всех перевести на асинхронный callback.
Спасибо.