2012-08-09 11 views
8

Qt documentation mówi zwracane wartości sygnałów nie są możliwe:Qt: Wartość zwracana sygnału działa, dlaczego oficjalny dokument mówi, że jest to niemożliwe/zabronione?

Sygnały są generowane automatycznie przez MOC i nie musi być realizowane w pliku .cpp. Nigdy nie mogą mieć typów zwracanych (tj. użyć pustych).

Podobne SO pytania:

  1. Can Qt signals return a value?
  2. Qt: meaning of slot return value?

Jednak z moich prób (Qt 4.8.1) Mogę powiedzieć wartości zwracanych zrobić pracę:

  1. Jeśli sygnał/gniazdo są w tym samym thr EAD, ConnectionType może być Qt::AutoConnection
  2. z sygnału/gniazdo w różnych wątkach muszę korzystać Qt::BlockingQueuedConnection

Więc w moim kodu Wzywam sygnał przez

QString dp = emit WscAircrafts::signalAircraftsJsonArray(); 

i moc sygnału zwraca QString ,

QString _t0; 
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) }; 
QMetaObject::activate(this, &staticMetaObject, 0, _a); 
return _t0; 

to tutaj jest moc gniazdo gdzie przechodzi z powrotem QString

case 4: { QString _r = _t->slotAircraftJsonArray(); 
    if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; 

Wszystko to wydaje się być dość proste, więc dlaczego ta sprzeczność z dokumentacją? Gdzie byłby problem z wykorzystaniem zwracanej wartości? Jak powiedzieliśmy, w moim kodzie to wydaje się działać.

+3

co się dzieje, jeśli sygnał jest podłączony do wielu gniazd? –

+2

W innym podobnym pytaniu odpowiedź brzmi: "Wygląda na to, że byłem w stanie wyemitować sygnał i odebrać wartość z gniazda, do którego podłączony był sygnał, ale problem polegał na tym, że zwrócił on tylko ostatnią wartość zwracaną przez wiele połączonych gniazd ". To musi być powód, dla którego nie chcą reklamować tej funkcji. –

+0

@RomanSaveljev - czy musiałby również zablokować, dopóki nie skończy się miejsce na slocie? –

Odpowiedz

5

Problem polega na tym, że zwracane typy nie są sprawdzane pod kątem kompatybilności w czasie połączenia, dlatego podłączenie podwójnie zwrotnego gniazda do sygnału zwracającego pływak, powiedzmy, spowoduje przepełnienie stosu (bez gry słów) przeznaczonego na pływak.

+0

Ale to również oznacza, że ​​jeśli typy zwrotu pasują i wszystko jest zrobione poprawnie, nie będzie problemu z ich użyciem. –

+1

@HorstWalter tak, chyba że połączenie jest w kolejce (w takim przypadku odroczone wywołanie slotu może zwalniać pamięć o długim czasie, ale nie sprawdziłem tego głęboko) lub jest więcej niż jedno gniazdo połączone z sygnałem (w takim przypadku Ty " d uzyskać tylko wynik ostatniego boksu). –

Powiązane problemy