2010-01-15 17 views
10

Sto chiamando uno emit signal1() da un thread non Qt. Per thread non Qt, intendo non dal loop eventi della GUI e non da alcun metodo QThread run() o da un qualsiasi loop di eventi di QThread.emette il segnale Qt dal thread non Qt o il loop di eventi principale di ouside Qt con 4.5

È semplicemente un pthread (pthread_create()) che chiama un metodo di QObject che emette segnali.

es:

MyQbject: public QObject 
{ 
... 
void emitBunchOfSignals() 
{ 
emit signal1(); 
emit signal2(); 
... 
} 
... 
} 

il metodo "run" del mio pthread che ha un puntatore a un'istanza MyObject (istanza che è stata creata all'interno del contesto del thread GUI Qt principale non la pthread) chiama il emitBunchOfSignals() metodi.

Prima di Qt 4.5 era brutto. Ora, Qt 4.5 gestisce questo? Chiama qApp->PostEvent() o qualcosa così il segnale viene emesso all'interno del thread della GUI Qt (e quindi anche dello slot)?

grazie

+0

Quando si chiama connect, è possibile impostare il tipo in modo esplicito sulla connessione in coda. –

+0

Nel tempo che ti ci è voluto per scrivere questa domanda, avresti potuto semplicemente aprire il codice e cercare te stesso. – shoosh

+0

Non sembra semplice in quanto si è verificato un arresto anomalo con Qt 3.xx. Ho familiarità con l'opzione di connessione (directconnection queuedconnection etc), ma ho pensato che funzionasse solo tra QTreads o tra un QThread e il loop degli eventi principale. Il motivo per cui ha avuto un crash con Qt 3.xx almeno non era semplice da capire guardando il codice. Sono pazzo? –

risposta

8

Cosa è necessario assicurarsi è che si utilizza una connessione in coda per una da fili, come Qt non può autmatically rilevare che oggetto che appartengono a quale thread ("filo affinità" è il termine usato nel documentazione). Si fa questo quando si collega:

connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection); 

Ciò comporterà il segnale immissione sul ciclo degli eventi della destinazione, e la fessura essere chiamato quando il filo è in funzione (cioè il suo ciclo di eventi).

+3

grazie mille. Per essere sicuro di capire cosa intendi: Dato che il mio QObject che emette non appartiene a un QThread né al thread Qt della GUI principale (in realtà appartiene al mio thread Corba), Qt non può percepire l'affinità del thread. Quindi devo forzare la connessione a QueuedConnection poiché AutomaticConnection non funzionerà in questo caso specifico. Tuttavia, quando QObject emette un QThread, Qt può rilevare l'affinità del thread e un AutomaticConnection farà il post necessario al ciclo Event del thread QObject del ricevitore. –

Problemi correlati