|
Pochodzi od: żaden
Zadeklarowany w: be/app/Invoker.h
Biblioteka: libbe.so
Podsumowanie: więcej...
BInvoker jest wygodną klasą, która pakuje wszystko co potrzebujesz do tworzenia poręcznych pakietów do wysyłania komunikatow. BInvoker zawiera: (a) BMessage, (b) BMessenger (który identyfikuje adres handler'a) i (c) opcjonalnie BHandler, który obsługuje odpowiedzi. Możesz ustawić te składniki, wywołać Invoke() i komunikat idzie do adresata. Odpowiedzi są wysyłane do handler'a odpowiedzi (domyślnie be_app).
BInvoker używa BMessenger::SendMessage() do wysyłania swoich komunikatów. Wywołanie jest asynchroniczne i nie ma tutaj ograniczeń czasowych w oczekiwaniu na odpowiedź.
BInvoker jest przeważnie używany jako klasa mieszana. Wiele klas w Interface Kit - szczególnie BControl - wywodzi się z BInvoker'a.
![]() | BInvoker() |
BInvoker(BMessage *message, BMessenger messenger)
BInvoker(BMessage *message, const BHandler *handler, const BLooper *looper = NULL)
BInvoker(void)Inicjalizuje BInvoker'a przez ustawienie jego komunikatu i jego posłańca.
- BMessage obiektu jest brany bezpośrednio jako komunikat message - obiekt nie jest kopiowany. BInvoker przejmuje właściciela BMessage, którego Ty przekazujesz.
- BMessenger jest kopiowany z posłańca messenger lub inicjalizowany z looper'em i handler'em. Popatrz do klasy BMessenger aby sprawdzić szczegóły jak BMessenger identyfikuje adresata.
Jeśli chcesz odpowiedzieć handler'owi wywołaj SetHandlerForReply() po tym jak konstruktor zwróci swoją wartość. Możesz ponownie ustawić komunikat i posłańca poprzez SetMessage() i SetTarget().
![]() | ~BInvoker() |
virtual ~BInvoker() Niszczy obiekty BMessage.
![]() | BeginInvokeNotify(), EndInvokeNotify() |
void BeginInvokeNotify(uint32 kind = B_CONTROL_INVOKED) void EndInvokeNotify() Jeśli z jakiegoś powodu potrzebujesz zaimplementować metodę która emuluje (naśladuje) InvokeNotify() wywołaj wewnętrzną implementację Invoke(), powinieneś opakowaś wywołanie swojego kodu w te funkcje. Ustanawiają one i likwidują kontekst funkcji InvokeNotify().
![]() | Command() patrz SetMessage() |
![]() | HandlerForReply() patrz SetHandlerForReply() |
![]() | Invoke(), InvokeNotify() |
virtual status_t Invoke(BMessage *message = NULL) status_t InvokeNotify(BMessage *message, uint32 kind = B_CONTROL_INVOKED) Invoke() mówi posłańcowi BInvoker'a aby wysłał on komunikat. Jeśli komunikat message nie jest NULL, to ten komunikat jest wysyłany, w przeciwnym wypadku obiekt wysyła swój domyślny komunikat (tj. BMessage, który był przekazany w konstruktorze lub w funkcji SetMessage()). Komunikat jest wysyłany asynchronicznie bez ograniczenia czasowego w oczekiwaniu na odpowiedź.
![]()
Odnośnie użycia komunikatu domyślnego wobec argumentu: powszechną praktyką jest rezerwowanie domyślnego komunikatu jako szablonu i przekazywanie dopracowanej kopii do funkcji Invoke():
/* Dodaje bieżący czas systemowy do kopii komunikatu domyślnego. */
BMessage copy(invoker.Message());
copy.AddInt64("when", system_time());
invoker.Invoke(©);Funkcja InvokeNotify() wysyła message do adresata, używając kodu powiadomienia o zmianie określonego przez kind. Jeśłi komunikat jest NULL, nic nie zostaje wysłane do adresata ale obserwatorzy handlera wywoływacza będą otrzymywać ich oczekiwane powiadomienia. Domyślnie kind jest B_CONTROL_INVOKED - tego samego rodzaju kind wysyłane po prostu przez Invoke().
![]()
Ogólnie powinieneś wywołać InvokeNotify() zamiast Invoke() w nowych aplikacjach BeOS'a, któe działają pod BeOS 5 lub późniejszym. Możesz mapować stary kod do nowego tak jak tutaj:
BeOS 4.5.x BeOS 5 Invoke() InvokeNotify(Message()) Invoke(Message()) InvokeNotify(Message()) Invoke(ModificationMessage()) InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED) Funkcja Invoke() nie wywołuje domyślnie SendNotices(); będziesz musiał zaimplementować ten kod sam. Jak tutaj:
status_t BControl::Invoke(BMessage *msg) {
bool notify = false;
uint32 kind = InvokeKind(¬ify);
BMessage clone(kind);
status_t err = B_BAD_VALUE;
if (!msg && !notify) {
// Jeśli nie jest dostarczony żaden komunikat, pobierz go z BInvoker'a.
// Jednakże zrób to TYLKO jeśli nie jest to kontekst InvokeNotify()
// -- w przeciwnym wypadku nie jest to wywołanie domyślne
// komunikatu, więc nie chcemy aby dostał się on tutaj w ten sposób.
// Przyładowo, kontrolka może wywoływać InvokeNotify() z jej
// komunikatem "modyfikacji"... jeśli ten komunikat nie jest ustawiony,
// nadal chcemy wysłać powiadomienie obserwatorów, ale
// -- nie chcemy wysyłać komunikatu poprzez wywoływacza.
msg = Message();
}
if (!msg) {
// Jeśli nie jest rozpoczęto obserwacji, nie ma tutaj nic do roboty.
if( !IsWatched() ) return err;
} else {
clone = *msg;
}
clone.AddInt64("when", system_time());
clone.AddPointer("source", this);
clone.AddInt32("be:value",fValue);
clone.AddMessenger(B_NOTIFICATION_SENDER, BMessenger(this));
if( msg ) err = BInvoker::Invoke(&clone);
// Również wyślij wysołanie do obserwatorów tego handler'a.
SendNotices(kind, &clone);
return err;
}ZWRACANE KODY
- B_OK. Kopmunikat został wysłany.
- B_BAD_VALUE. Nie ma komunikatu domyślnego i nie ma argumentu message.
- Inne błędy wysyłane z BMessenger::SendMessage().
![]() | InvokeKind() |
uint32 InvokeKind(bool *notify = NULL) Zwraca rodzaj przekazany do InvokeNotify(). Powinien on być wywołany z wnętrza Twojej implementacji funkcji Invoke() jeśli potrzebujesz ustalić jaki rodzaj określono gdy była wywołana funkcja InvokeNotify(). Jeśli troszczysz się o to czy pierwotnie były wywołane Invoke() lub InvokeNotify(), możesz określić wskaźnik typu bool do notify, który jest ustawiony na true jeśli była wywołana InvokeNotify() lub false jeśli była wywołana Invoke().
Pozwala Ci to pobrać argumenty InvokeNotify() z Twojego kodu Invoke() bez przerywania zgodności ze starymi aplikacjami przez dopdanie argumentów do Invoke().
![]() | InvokeNotify() patrz Invoke() |
![]() | IsTargetLocal() patrz SetTarget() |
![]() | Message() patrz SetMessage() |
![]() | Messenger() patrz SetTarget() |
![]() | SetHandlerForReply(), HandlerForReply() |
virtual status_t SetHandlerForReply(BHandler *replyHandler) BHandler *HandlerForReply(void) const SetHandlerForReply() ustawia obuiekt BHandler któy obsługuje odpowiedzi, któe są odsyłąne przez adresata. Domyślnie (lub jeśli replyHandler jest równy NULL), odpowiedzi są wysyłane do obiektu BApplication.
HandlerForReply() zwraca obiekt ustawiony poprzez SetHandlerForReply(). Jeśli handler odpowiedzi nie jest ustawiony, funkcja ta zwraca NULL, nie zwraca ona be_app (odpowiedź będzie obsługiwana również poprzez be_app).
ZWRACANE KODY
- SetHandlerForReply() zawsze zwraca B_OK - nie sprawdza ona poprawności.
![]() | SetMessage(), Message(), Command() |
virtual status_t SetMessage(BMessage *message) BMessage *Message(void) const uint32 Command(void) const SetMessage() ustawia domyślny komunikat BInvoker'a aby wskazywał na message (komunikat nie jest kopiowany). Poprzedni komunikat domyślny (jeśli był) jest kasowany; komunikat message równy NULL usuwa poprzedni komunikat bez ustawiania nowego. BInvoker posiada BMessage, który Ci przekazuje; nie musisz go sam delete (niszczyć).
Message() zwraca wskaźnik do komunikatu domyślnego a Command() zwraca jego daną członkowską what. Nie posiadając komunikatu domyślnego funkcje te zwracają NULL.
ZWRACANE KODY
- SetMessage() zawsze zwraca B_OK.
![]() | SetTarget(), Target(), IsTargetLocal(), Messenger() |
virtual status_t SetTarget(BMessenger messenger)
virtual status_t SetTarget(const BHandler *handler, const BLooper *looper = NULL)BHandler *Target(BLooper **looper = NULL) const bool IsTargetLocal(void) const BMessenger Messenger(void) const Te funkcje ustawiają i zapytują adresata BInvoker'a. Jest to BHandler którego obiekt wysyła komunikat gdy jest wywoływana funkcja Invoke(). Adresat jest reprezentowany przez obiekt BMessenger; możesz ustawić BMessenger jako kopię posłańca messenger lub zainicjalizowac go z looper'a i handler'a. Popatrz do klasy BMessenger aby przeglądnąć szczegóły jak BMessenger identyfikuje adresata.
Target() zwraca BHandler'a który jest adresowany przez obiekt posłańca. Jeśli looper nie jest równy NULL, BLooper któy posiada BHandler'a jest zwracany przez referencję. Jeśli adresat był ustawiony jako preferowany handler looper'a (tj. SetTarget(NULL, looper)) lub jeśli adresat nie zosatł jeszcze ustawiony Target() zwraca NULL. Ta funkcja zwraca NULL dla obu obiektów jeśli adresat jest zdalny.
IsTargetLocal() zwraca true jeśli adresat jest obecny w aplikacji BInvoker'a i false jeśli należy on do jakiejś innej aplikacji.
Messenger() zwraca kopię obiektu BMessenger którego BInvoker używa do wysyłania komunikatów. Jeśli adresat jeszcze nie został ustawiony zwracana wartość będzie niepoprawna.
ZWRACANE KODY
- B_OK. Adreast został ustawiony z sukcesem.
- B_BAD_VALUE. Proponowany handler nie należy do BLooper'a.
- B_MISMATCHED_VALUES. handler nie należy do looper'a.
![]()
SetTarget() nie wykrywa nieprawidłowych BLooper'ów i BMessenger'ów.
![]() | SetTimeout(), Timeout() |
status_t SetTimeout(bigtime_t timeout) bigtime_t Timeout(void) const SetTimeout() ustawia przerwę, która będzie używana gdy wysyłany jest wywoływany komunikat do adresata wywoływacza. Domyślnie jest on równy B_INFINITE_TIMEOUT.
Timeout() zwraca bieżące ustawienie dla tej wartości.
ZWRACANE KODY
- B_OK. Brak błędu.
![]() | Target() patrz SetTarget() |
![]() | Timeout() patrz SetTimeout()
|
|
Be
Book,
...w ślicznym HTML...
dla BeOS wydanie 5
Copyright © 2000 Be, Inc. Wszelkie prawa zastrzeżone.