2016-07-06 38 views
5

Ho un server con thread.Sposta QTcpSocket in una nuova discussione dopo l'avvio della connessione

QTcpSocket deve essere creato sul thread su cui deve essere eseguito, FI: Qt - Handle QTcpSocket in a new thread passando il descrittore di socket.

Il mio problema è che ho bisogno di avere un pool di thread e spostare il socket su un thread specifico DOPO che il client ha inviato un token specifico che definisce su quale thread deve essere il socket.

In altre parole, ho bisogno di leggere il socket per sapere su quale thread metterlo in anticipo.

Alcuni idea sarebbe quella di legarsi prima a un QTcpSocket, leggere, quindi inviare il descrittore per il filo e creare un altro QTcpSocket ma il dottore dice:

Nota: Non è possibile inizializzare due prese astratti con lo stessodescrittore di socket nativo.

Un'altra soluzione è creare il socket in un thread separato e quindi unire entrambi i thread insieme, anche se non so se sia possibile.

O forse è possibile leggere il descrittore di socket sul thread principale prima di chiamare setSocketDescriptor sul thread secondario, se ciò è possibile?

+1

per curiosità, perché dovresti fare in modo che il client ti dica su quale thread devi eseguire il tuo 'QTcpSocket'? – Mike

+0

* token specifico che definisce su quale thread deve essere il socket * - Mi chiedo come sia possibile specificare * quale * thread deve essere il socket. AFAIK non è possibile specificare l'id del thread durante la creazione di un thread. Se vuoi specificare il nome del thread, puoi semplicemente chiamare thread -> setObjectName ("Name") e questo non ha nulla a che fare con i socket. – rightaway717

+0

perché non si fa semplicemente socket-> moveToThread (otherthread)? –

risposta

0

si può assolutamente muoversi facilmente prese attraverso qthreads, basta prestare attenzione a quattro cose:

1) Assicurarsi che il QTcpSocket non ha genitore prima di spostare

2) Scollegare tutto, da oggetto socket prima mossa

3) Collegare tutto il necessario tornare in una funzione che è in esecuzione in un thread di destinazione (è possibile utilizzare una sorta di piscina in un thread ci quegli oggetti 'spostati' memorizzati prima discussione prenderli

4) Chiama readAll() dopo init poichè potresti perdere alcuni segnali readyRead()

Non vedo alcun motivo per non farlo se questo si adatta al design, almeno l'ho usato molte volte per i servizi multithreading per dividere le prese gestori su core.

+1

Riceverai avvisi da 'QIODevice' durante la scrittura dei dati. Perché non tutti i campi di 'QTcpSocket' possono essere spostati tra i thread. –

+0

Ultimi anni funziona tutto bene poiché ho usato questa tecnica in molti progetti. Puoi specificare che tipo di avvertimento vuoi dire? – evilruff

+1

Proverò a trovarne di più, perché non ho accesso a codebase.Ma c'era un avvertimento successivo: "QSocketNotifier: i notificatori di socket non possono essere abilitati da un altro thread" –

Problemi correlati