Nie zobaczysz dużej różnicy, chyba że pracujesz z obiektami o różnych powinowactwach do gwintów. Załóżmy, że masz QObjects A
i B
i oba są dołączone do różnych wątków. A
ma sygnał o nazwie somethingChanged()
i B
ma gniazdo o nazwie handleChange()
.
Jeśli używasz bezpośredniego połączenia
connect(A, SIGNAL(somethingChanged()), B, SLOT(handleChange()), Qt::DirectConnection);
przy czym sposób handleChange()
będzie faktycznie działać w wątku A
„s. Zasadniczo jest tak, jakby emitowanie sygnału wywoływało metodę "bezpośrednio". Jeśli B::handleChange()
nie jest bezpieczny dla wątków, może to powodować niektóre (trudne do zlokalizowania) błędy. Przynajmniej tracisz zalety dodatkowego wątku.
Jeśli zmienisz metodę połączenia na Qt::QueuedConnection
(lub, w tym przypadku niech Qt zdecyduje, której metody użyć), sprawy będą bardziej interesujące. Zakładając, że wątek B
uruchamia pętlę zdarzeń, emitowanie sygnału spowoduje opublikowanie zdarzenia w pętli zdarzeń B
. Pętla zdarzeń umieszcza w kolejce zdarzenie i ostatecznie wywołuje metodę szczeliny, gdy tylko sterowanie wróci do niej (jest to pętla zdarzeń). To sprawia, że łatwo jest poradzić sobie z komunikacją pomiędzy/między wątkami w Qt (ponownie, zakładając, że twoje wątki uruchamiają własne lokalne pętle zdarzeń). Nie musisz się martwić o zamki, itp., Ponieważ pętla zdarzeń serializuje inwokacje wrzutowe.
Uwaga: Jeśli nie wiesz, jak zmienić powinowactwo wątku QObject, spójrz na QObject::moveToThread
. To powinno ci na początek wystarczyć.
Edit
powinienem wyjaśnić moje otwarcie zdanie. To robi różnicę, jeśli określić w kolejce połączenie - nawet dla dwóch obiektów w tym samym wątku. Zdarzenie jest nadal publikowane w pętli zdarzeń wątku. Tak więc wywołanie metody jest nadal asynchroniczne, co oznacza, że może być opóźnione w nieprzewidywalny sposób (w zależności od innych zdarzeń, które pętla może potrzebować do przetworzenia). Jeśli jednak nie określisz metody połączenia, metoda bezpośrednia jest automatycznie używana do połączeń między obiektami w tym samym wątku (przynajmniej jest to w Qt 4.8).
Zobacz http://stackoverflow.com/questions/11230080/qobject-based-class-has-a-queued-connection-toself i http://qt-project.org/doc/qt-4.8/ threads-qobject.html – user1929959
Czego konkretnie nie rozumiesz? Twoje pytanie sprowadza się do tego, "jak działają sygnały i automaty" bez tego, co jest nieco obszerne i dobrze opisane w dokumentach. – Mat
Hmm .. o ile rozumiem, QueuedConnection powinien być używany, gdy nadawca i odbiorca są w różnych wątkach. Na przykład mam wątek GUI (główny wątek) i nowy wątek (pThread), który ma na przykład sygnał void doSomething(); i odbiornik jest głównym wątkiem GUI. Tak więc, muszę korzystać z QueuedConnection, nieważne, jak to nazwać? (w wątku GUI lub nowym wątku, polecenie connect) Dziękuję .. – Nika