std.signals
Сигналы и слоты — это реализация паттерна Наблюдатель. По сути, при генерации сигнала вызывается список подключенных наблюдателей (называемых слотами).
Существуют различные реализации сигналов и слотов на D. Эта версия использует несколько новых возможностей D, что упрощает её использование и снижает вероятность ошибок. В частности, теперь нет необходимости в инструментировании слотов.
- Ссылки
- Более глубокий взгляд на сигналы и слоты
Паттерн наблюдатель
Википедия
Boost Signals
Qt
Сигналы и слоты в D
Динамическое связывание — сигналы и слоты Qt по сравнению с Objective-C
Разобрать SS
о harmonia
Другой модуль обработки событий
Предложение: механизм сигналов/слотов
Сигналы и слоты?
Сигналы и слоты готовы к оценке
Сигналы и слоты для Уолтера
Механизм сигналов/слотов?
Современные возможности?
Делегаты против интерфейсов
Значение компонентного программирования (свойства, сигналы и слоты и т. д.)
сигналы и слоты
- Ошибки:
- Слоты могут быть только делегатами, образованными из объектов классов или интерфейсов к объектам классов. Если в connect() передаётся делегат на что-то другое, например, на функцию члена структуры, вложенную функцию, COM-интерфейс или замыкание, результат будет неопределённым. Небезопасно для нескольких потоков, работающих с одними и теми же сигналами или слотами.
- Лицензия:
- Лицензия Boost 1.0.
- Авторы:
- Уолтер Брайт
- Исходный код
- std/signals.d
- шаблон Signal(T1...)
-
Миксин для создания сигнала внутри объекта класса.
Разные сигналы могут быть добавлены в класс путем именования миксинов.
- Примеры:
-
import std.signals; int observedMessageCounter = 0; class Observer { // our slot void watch(string msg, int value) { switch (observedMessageCounter++) { case 0: writeln(msg); // "setting new value" writeln(value); // 4 break; case 1: writeln(msg); // "setting new value" writeln(value); // 6 break; default: assert(0, "Unknown observation"); } } } class Observer2 { // our slot void watch(string msg, int value) { } } class Foo { int value() { return _value; } int value(int v) { if (v != _value) { _value = v; // call all the connected slots with the two parameters emit("setting new value", v); } return v; } // Mix in all the code we need to make Foo into a signal mixin Signal!(string, int); private : int _value; } Foo a = new Foo; Observer o = new Observer; auto o2 = new Observer2; auto o3 = new Observer2; auto o4 = new Observer2; auto o5 = new Observer2; a.value = 3; // should not call o.watch() a.connect(&o.watch); // o.watch is the slot a.connect(&o2.watch); a.connect(&o3.watch); a.connect(&o4.watch); a.connect(&o5.watch); a.value = 4; // should call o.watch() a.disconnect(&o.watch); // o.watch is no longer a slot a.disconnect(&o3.watch); a.disconnect(&o5.watch); a.disconnect(&o4.watch); a.disconnect(&o2.watch); a.value = 5; // so should not call o.watch() a.connect(&o2.watch); a.connect(&o.watch); // connect again a.value = 6; // should call o.watch() destroy(o); // destroying o should automatically disconnect it a.value = 7; // should not call o.watch() writeln(observedMessageCounter); // 2
- alias slot_t = void delegate(T1);
-
Слоты реализуются как делегаты. slot_t — тип делегата. Делегат должен быть связан с экземпляром класса или интерфейсом экземпляра класса. Делегаты на экземпляры структур или вложенные функции не должны использоваться в качестве слотов.
- final void emit(T1 i);
-
Вызов каждого из подключенных слотов, передавая им аргумент(ы) i.
Вложенные вызовы будут проигнорированы.
- final void connect(slot_t slot);
-
Добавление слота в список слотов, которые будут вызваны при вызове emit().
- final void disconnect(slot_t slot);
-
Удаление слота из списка слотов, которые будут вызваны при вызове emit().
- final void disconnectAll();
-
Отключение всех слотов.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_signals.html