2012-06-27 10 views
5

Szukałem kodu źródłowego, nad którym pracuję. Znalazłem dziwne stwierdzenie, że ktoś kodował. Kod źródłowy to aplikacja GUI z GUI QML i używa QT 4.7.x.Klasa oparta na QObject ma ustawione w kolejce połączenie z samym sobą

Poniższy fragment należy do głównej logiki aplikacji.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

To dziwne, że obiekt łączy się sama poprzez kolejce związku, który w istocie oznacza, że ​​obiekt może „na żywo” w różnych wątków w tym samym czasie?

Na pierwszy rzut oka nie miało to dla mnie żadnego sensu. Czy ktokolwiek może pomyśleć o jakiejkolwiek przyczynie, dla której takie połączenie byłoby wiarygodne lub potrzebne? Czy to nawet zadziała?

Odpowiedz

9

Będzie działać bez problemu. Być może było wymagane przetwarzanie pętli zdarzeń przed wywołaniem SetCurrentTaskSlot?

Należy zauważyć, że QueuedConnection nie oznacza, że ​​coś jest w innym wątku. QueuedConnection oznacza tylko, że gdy sygnał zostanie wyemitowany, odpowiedni slot nie zostanie wywołany bezpośrednio. Zostanie on umieszczony w kolejce w pętli zdarzeń i zostanie przetworzony, gdy kontrola zostanie zwrócona do pętli zdarzeń

+0

Ma sens. Wciąż patrzę na rzeczy otaczające kod. Więc wrócę, gdy tylko będzie jasne, co się dzieje. –

+1

Wygląda więc na to, że podczas wykonywania niektórych obliczeń emitowany jest sygnał zmiany zadania i że "zmiana" nie powinna nastąpić natychmiast, ale po wykonaniu bieżącego przepływu i wznowieniu przetwarzania zdarzenia. –

3

Kolejkowanie nie ma wpływu na to, gdzie mieszka odbiornik. Jest odwrotnie: aby bezpiecznie wysyłać sygnały do ​​obiektu znajdującego się w innym wątku, musisz używać oczekujących połączeń. Ale możesz ich użyć do obiektu żyjącego w dowolnym wątku!

Jeden używa połączenia w kolejce, aby zapewnić, że sygnał zostanie dostarczony z pętli zdarzeń, a nie bezpośrednio z witryny emisji, jak to się dzieje w przypadku bezpośredniego połączenia. Bezpośrednie połączenie jest konceptualnie zestawem wywołań do wskaźników funkcji na liście. Połączenie w kolejce jest koncepcyjnie zdarzeniem wysyłanym do sprytnego odbiorcy, który może wykonać wywołanie funkcji na podstawie zawartości zdarzenia.

Zdarzenie jest wewnętrzne: QMetaCallEvent i jest to QObject::event, które działa na to zdarzenie i wykonuje połączenie.

Powiązane problemy