|
Pochodzi od: żaden
Zadeklarowany w: be/app/Messenger.h
Biblioteka: libbe.so
Alokacja: stos lub konstruktor
Podsumowanie: więcej...
BMessenger (posłaniec) reprezentuje i wysyła komunikaty do adresata komunikatu, gdzie adresatem jest BLooper i, opcjonalnie, określony BHandler w tym looper'ze. Adresat może przebywać w tej samej aplikacji jako BMessenger (lokalny adresat) albo może przebywać w jakiejś innej aplikacja (zdalny adresat).
Najbardziej znacząca funkcją BMessenger'a jest SendMessage(), która wysyła jego argument BMessage do adresata.
![]()
Dla lokalnego adresata, SendMessage() jest z grubsza równoważna, jeżeli chodzi o skuteczność, wysyłaniu wiadomości bezpośrednio do adresata BMessenger'a (tj. BLooper::PostMessage()). Globalny wskaźnik be_app_messenger BMessenger'a, który adresuje główną pętlę komunikatu zmiennej globalnej be_app, automatycznie jest inicjalizowany za Ciebie kiedy tworzysz swój obiekt BApplication. Możesz użyć go wszędzie tam gdzie są wywoływane BMessenger'y.
![]() | BMessenger() |
BMessenger(const BHandler *handler,
const BLooper *looper = NULL,
status_t *error = NULL)
BMessenger(const char *signature,
team_id team = -1,
status_t *error = NULL)
BMessenger(const BMessenger &messenger)
BMessenger(void)Tworzy nowy BMessenger i ustawia jego adresata na lokalny looper/handler, aplikacji (działającej) określonej przez sygnaturę signature lub zespół team lub na adresata jakiegoś innego posłańca messenger.
- Looper/handler. Aby zaadresować looper'a, dostarcz looper'a looper i podaj handler handler równy NULL. Kiedy posłaniec wysyła komunikat, ten komunikat będzie obsłużony przez preferowany handler looper'a looper. Jeśli chcesz aby komunikat został wysłany do określonego handler'a wewnątrz looper'a, dostarcz handler handler i podaj looper looper równy NULL. Handler musi już być przyłączony do looper'a i nie może przełączyć looper'ów po skonstruowaniu tego BMessenger'a.
- Sygnatura zespołu. Jeśli dostarczasz sygnaturę signature ale zostawiasz zespół jako -1, posłaniec adresuje aplikację z tą sygnaturą. (Aplikacja musi już działać; w przypadku wielu egzemplarzy działającej aplikacji, właściwy egzemplarz jest nieoznaczony.) Jeśli dostarczysz zespółteam ale bez sygnatury signature, adresujesz dokładnie ten zespół, nie bacząc na sygnaturę. Przez dostarczenie zarówno zespołu team i sygnatury signature, możesz wyraźnie określać egzemplarz aplikacji. W tym przypadku, zespół team musi być aplikacją, która ma właściwą sygnaturę signature.
Komunikaty wysłane do zdalnego adresata są odbierane i obsługiwane przez obiekt zdalnej aplikacji BApplication.
BMessenger nie posiada jego adresata.
ZWRACANE KODY
Konstruktor umieszcza kod błędu w argumencie error (jeśli był dostarczony).
- B_OK. Adresat został ustawiony właściwie.
- B_BAD_VALUE. Aplikacja zidentyfikowana przez sygnaturę signature nie mogła zostać znaleziona lub zarówno handler jak i looper są nieprawidłowe.
- B_BAD_TEAM_ID. Nieprawidłowy team.
- B_MISMATCHED_VALUES. team nie jest sygnaturą signature aplikacji lub handler jest przypisany do innegoBLooper'a niż looper looper.
- B_BAD_HANDLER. Handler handler nie jest jest przypisany do BLooper.
![]() | ~BMessenger() |
~BMessenger() Zwalnia obiekt BMessenger; adresat nie jest naruszany.
![]() | IsTargetLocal() patrz Target() |
![]() | IsValid() |
bool IsValid(void) const Zwraca true jeśli docelowy looper, czy to lokalny czy zdalny, nadal istnieje.
![]()
Ta funkcja nie mówi Ci, czy looper jest rzeczywiście gotowy, by odebrać komunikat lub czy handler (jeśli zostało on określony w konstruktorze) istnieje. Inaczej mówiąc , prawidłowy BMessenger nie jest żadną gwarancją, że komunikat rzeczywiście zostanie dostarczony adresatowi.
![]() | LockTarget(), LockTargetWithTimeout() |
bool LockTarget(void) const status_t LockTargetWithTimeout(bigtime_t timeout) const
![]()
Te funkcje odnoszą się tylko do lokalnych adresatów. Te funkcje usiłują, zablokować docelowy looper w taki sposób jak podobnie nazwane funkcje BLooper'a (patrz BLooper::LockTarget()). Dodatkowo do kodów błędów tam zgłaszanych, te funkcje zwracają false i B_BAD_VALUE (odpowiednio) jeśli adresat nie jest lokalny albo jeśli w przeciwnym razie looper jest nieprawidłowy.
![]() | SendMessage() |
status_t SendMessage(BMessage *message,
BMessage *reply,
bigtime_t deliveryTimeout = B_INFINITE_TIMEOUT,
bigtime_t replyTimeout = B_INFINITE_TIMEOUT) const
status_t SendMessage(BMessage *message,
BHandler *replyHandler = NULL,
bigtime_t deliveryTimeout = B_INFINITE_TIMEOUT) const
status_t SendMessage(BMessage *message,
BMessenger *replyMessenger,
bigtime_t deliveryTimeout = B_INFINITE_TIMEOUT) const
status_t SendMessage(uint32 command, BMessage *reply) const
status_t SendMessage(uint32 command, BHandler *replyHandler = NULL) constWysyła kopię komunikatu message (lub BMessage oparty na stałej polecenia command) do adresata obiektu. Wywołujący zachowuje na własność komunikat message. Funkcja nie zwraca wartości dopóki komnikat nie dostanie dostraczony; jeśli wysyłasz komunikat message (w przeciwieństwie do stałej polecenia command) możesz ustawićprzerwę dostawy w mikrosekundach poprzez argument deliveryTimeout.
Adresat może odpowiedzieć na komunikat:
- Jeśl dostarczyłeś obiekt BMessage jako argument reply, odpowiedź jest synchroniczna, z dodatkową przerwą (replyTimeout) której odliczanie zaczyna się po dostarczeniu pierwotnego komunikatu. Jeśli odpowedź przekroczy czas lub adresat usunie pierwotny komunikat bez odpowiadania, odpowiedź reply->what jest ustawiana na wartość B_NO_REPLY. Wywołujący jest zobowiązany do zarezerwowania (alokowania) i zwolnienia reply. Argumenty message i reply mogą być tym samym obiektem.
![]()
Bądź ostrożny gdy żądasz odpowiedzi synchronicznej: jeśli wywołasz SendMessage() z wątku docelowego looper'a, nastąpi zakleszczenie (lub w najlepszym wypadku przerwa).
- Jeśli dostarczysz adresata (replyMessenger lub replyHandler), odpowiedź jest asynchroniczna i jest wysyłana odpowiedź do adresata.
- Jeśli nie dostarczysz ani komunikatu odpowiedzi ani adresata odpowiedzi, odpowiedź adresata jest wysyłana do be_app_messenger.
ZWRACANE KODY
- B_OK. Komunikat został odstarczony (a odpowiedź synchroniczna została odebrana jeśli jeśli jest przydatna).
- B_TIMED_OUT. Upłynął okres deliveryTimeout; komunikat nigdy nie dotarł do adresata.
- B_WOULD_BLOCK. Zażądałeś argumentudeliveryTimeout równego 0 a kolejka komunikatów adresata jest pełna.
- B_BAD_PORT_ID. Adresaat posłańca jest nieprawidłowy lub port odpowiedzi został zniszczony podczas oczekiwaniana odpowiedź (tylko żądania odpowiedzi synchronicznej).
- B_NO_MORE_PORTS. Spytałeś o odpowiedź synchroniczną ale nie ma więcej portów odpowiedzi.
![]()
Jeśli określiłeś handler handler gdy konstruowałeś swój BMessenger i, jeśli ten handler odtąd zmienił looper'y, SendMessage() nie dostarczy jego komunikatu, ale nie zgłosi ona zastrzeżeń ( zwraca ona B_OK).
![]() | Target(), IsTargetLocal(), Team() |
BHandler *Target(BLooper **looper) const bool IsTargetLocal(void) const inline team_id Team(void) const Target() zwraca handler BMessenger'a (bezpośrednio) i looper (przez przekazanie go w argumencie looper). Ta funkcja działa tylko dla adresató lokalnych. Jeśli Target() zwraca NULL, to może oznaczać jedną z czterech rzeczy:
- Adresat jest zdalny; looper jest ustawiony na NULL.
- BMessenger nie został zaincjalizowany; looper looper jest ustawiony na NULL.
- Handler jest preferowanym handler'em looper'a; looper będzie prawidłowy.
- Handler został zniszczony; dany looper będzie obowiązywał aż on także zostanie zniszczony.
IsTargetLocal() zwraca wartość równą true jeśli adresat jest lokalny. Team() zwraca zespół adresata.
![]() | Team() patrz Target() |
![]() | = (przypisanie) |
BMessenger &operator =(const BMessenger&) Przypisuje lewą stronę adresata BMessenger'a do tej z prawej strony obiektu.
![]() | == (równość) |
bool operator ==(const BMessenger&) const Dwa obiekty typu BMessenger są równe jeśli mają takich samych adresatów.
|
Be
Book,
...w ślicznym HTML...
dla BeOS wydanie 5
Copyright © 2000 Be, Inc. Wszelkie prawa zastrzeżone.