F # - Olaylar
Etkinlikler, sınıfların birbirleri arasında mesaj gönderip almasına izin verir.
GUI'de olaylar, tuşa basma, tıklamalar, fare hareketleri vb. Gibi kullanıcı eylemleri veya sistem tarafından oluşturulan bildirimler gibi bazı olaylardır. Uygulamalar meydana geldiklerinde olaylara yanıt vermelidir. Örneğin, keser. Olaylar, süreçler arası iletişim için kullanılır.
Nesneler birbirleriyle senkronize mesaj geçişi yoluyla iletişim kurar.
Olaylar diğer işlevlere eklenir; nesne kaydıcallback işlevi bir olaya dönüştürür ve bu geri çağrılar, olay bir nesne tarafından tetiklendiğinde (ve eğer) yürütülür.
Etkinlik Sınıfı ve Etkinlik Modülü
Control.Event <'T> Sınıfı, gözlemlenebilir bir nesne veya olay oluşturmaya yardımcı olur.
Olaylarla çalışmak için aşağıdaki örnek üyelerine sahiptir -
Üye | Açıklama |
---|---|
Yayınla | Bir gözlemi birinci sınıf bir değer olarak yayınlar. |
Tetikleyici | Verilen parametreleri kullanarak bir gözlemi tetikler. |
Control.Event Modülü, olay akışlarını yönetmek için işlevler sağlar -
Değer | Açıklama |
---|---|
ekle: ('T → birim) → Olay <' Del, 'T> → birim | Verilen olay her tetiklendiğinde verilen işlevi çalıştırır. |
seçin: ('T →' U seçeneği) → IEvent <'Del,' T> → IEvent <'U> | Orijinal olaydan seçilen mesajlarda tetiklenen yeni bir olay döndürür. Seçim işlevi, orijinal bir mesajı isteğe bağlı yeni bir mesaja götürür. |
filtre: ('T → bool) → IEvent <' Del, 'T> → IEvent <' T> | Orijinal olayı dinleyen yeni bir olay döndürür ve sonuçta oluşan olayı yalnızca olayın bağımsız değişkeni verilen işlevi geçtiğinde tetikler. |
map: ('T →' U) → IEvent <'Del,' T> → IEvent <'U> | Verilen işlev tarafından dönüştürülen değerleri geçiren yeni bir olay döndürür. |
birleştirme: IEvent <'Del1,' T> → IEvent <'Del2,' T> → IEvent <'T> | Giriş olaylarından biri tetiklendiğinde çıkış olayını tetikler. |
ikili: IEvent <'Del,' T> → IEvent <'T *' T> | Giriş olayının ikinci ve sonraki tetiklemesinde tetiklenen yeni bir olay döndürür. Nth girdi olayının tetiklenmesi, argümanları N-1th ve Nthbir çift olarak tetikleme. Argüman,N-1th tetikleme, gizli dahili durumda tutulur. Nth tetikleme meydana gelir. |
bölüm: ('T → bool) → IEvent <' Del, 'T> → IEvent <' T> * IEvent <'T> | Orijinal olayı dinleyen yeni bir olay döndürür ve koşulun olay bağımsız değişkenlerine uygulanması true değerini döndürürse ortaya çıkan ilk olayı ve false döndürdüyse ikinci olayı tetikler. |
tarama: ('U →' T → 'U) →' U → IEvent <'Del,' T> → IEvent <'U> | Girdi olayında tetiklenen ardışık değerlere verilen biriktirme işlevinin uygulanmasının sonuçlarından oluşan yeni bir olay döndürür. Bir iç durum öğesi, durum parametresinin geçerli değerini kaydeder. Toplama işlevinin yürütülmesi sırasında dahili durum kilitlenmez, bu nedenle IEvent girişinin aynı anda birden çok iş parçacığı tarafından tetiklenmemesine dikkat edilmelidir. |
bölünme: ('T → Seçim <' U1, 'U2>) → IEvent <' Del, 'T> → IEvent <' U1> * IEvent <'U2> | İşlevin olay bağımsız değişkenlerine uygulanması bir Choice1Of2 döndürürse, orijinal olayı dinleyen ve ilk sonuçlanan olayı tetikleyen yeni bir olay döndürür ve bir Choice2Of2 döndürürse ikinci olay. |
Etkinlik Oluşturma
Etkinlikler aracılığıyla oluşturulur ve kullanılır Eventsınıf. Etkinlik yapıcısı, bir olay oluşturmak için kullanılır.
Misal
type Worker(name : string, shift : string) =
let mutable _name = name;
let mutable _shift = shift;
let nameChanged = new Event<unit>() (* creates event *)
let shiftChanged = new Event<unit>() (* creates event *)
member this.Name
with get() = _name
and set(value) = _name <- value
member this.Shift
with get() = _shift
and set(value) = _shift <- value
Bundan sonra, nameChanged alanını genel bir üye olarak göstermeniz gerekir, böylece dinleyiciler etkinliğe bağlanabilir. Publish olayın özelliği -
type Worker(name : string, shift : string) =
let mutable _name = name;
let mutable _shift = shift;
let nameChanged = new Event<unit>() (* creates event *)
let shiftChanged = new Event<unit>() (* creates event *)
member this.NameChanged = nameChanged.Publish (* exposed event handler *)
member this.ShiftChanged = shiftChanged.Publish (* exposed event handler *)
member this.Name
with get() = _name
and set(value) = _name <- value
nameChanged.Trigger() (* invokes event handler *)
member this.Shift
with get() = _shift
and set(value) = _shift <- value
shiftChanged.Trigger() (* invokes event handler *)
Ardından, olay işleyicilerine geri aramalar eklersiniz. Her olay işleyicisi, birkaç yöntem sağlayan IEvent <'T> türüne sahiptir -
Yöntem | Açıklama |
---|---|
val Ekle: olay :( 'T → birim) → birim | Bir dinleyici işlevini olaya bağlar. Olay tetiklendiğinde dinleyici çağrılacaktır. |
val AddHandler: 'del → birim | Bir işleyici temsilcisi nesnesini olaya bağlar. İşleyici daha sonra RemoveHandler kullanılarak kaldırılabilir. Olay tetiklendiğinde dinleyici çağrılacaktır. |
val RemoveHandler: 'del → birim | Bir olay dinleyici deposundan bir dinleyici temsilcisini kaldırır. |
Aşağıdaki bölüm tam bir örnek sağlar.
Misal
Aşağıdaki örnek, yukarıda tartışılan kavramı ve teknikleri göstermektedir -
type Worker(name : string, shift : string) =
let mutable _name = name;
let mutable _shift = shift;
let nameChanged = new Event<unit>() (* creates event *)
let shiftChanged = new Event<unit>() (* creates event *)
member this.NameChanged = nameChanged.Publish (* exposed event handler *)
member this.ShiftChanged = shiftChanged.Publish (* exposed event handler *)
member this.Name
with get() = _name
and set(value) =
_name <- value
nameChanged.Trigger() (* invokes event handler *)
member this.Shift
with get() = _shift
and set(value) =
_shift <- value
shiftChanged.Trigger() (* invokes event handler *)
let wk = new Worker("Wilson", "Evening")
wk.NameChanged.Add(fun () -> printfn "Worker changed name! New name: %s" wk.Name)
wk.Name <- "William"
wk.NameChanged.Add(fun () -> printfn "-- Another handler attached to NameChanged!")
wk.Name <- "Bill"
wk.ShiftChanged.Add(fun () -> printfn "Worker changed shift! New shift: %s" wk.Shift)
wk.Shift <- "Morning"
wk.ShiftChanged.Add(fun () -> printfn "-- Another handler attached to ShiftChanged!")
wk.Shift <- "Night"
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
Worker changed name! New name: William
Worker changed name! New name: Bill
-- Another handler attached to NameChanged!
Worker changed shift! New shift: Morning
Worker changed shift! New shift: Night
-- Another handler attached to ShiftChanged!