Salut à tous,
je suis en train de réaliser un ensemble client serveur pour le boulot et je suis coincé.
Je n'arrive pas à trouver de moyen "propre" pour "passer" la socket au thread qui doit s'en occuper.
j'aimerai connecter la socket au thread pour que lorsque le client se déconnecte le thread se coupe mais j'ai des messages type :
"QSocketNotifier: socket notifiers cannot be enabled from another thread"
Je pense que c'est lié au fait que la socket est passé en argument pour le constructeur et non "construite" dans le run.
mais du coup je ne sais pas comment faire.
voila mon code :
lorsqu'une nouvelle connection est reçu :
(pour le moment je n'ai mis qu'un seul thread pour les tests ensuite je pense gérer ça en pool ou en threadlist)
le constructeur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void ServerTcp::nouvelleConnexion(void) { QTcpSocket *nouveauClient = serveur->nextPendingConnection(); mThread = new MyThread(nouveauClient); mThread->start(); }
le run....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 MyThread::MyThread(QTcpSocket * soc) { MySocket=soc; desc = new descripteurViper(); connected=true; }
merci à tous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 void MyThread::run() { connect(MySocket,SIGNAL(disconnected()),this,SLOT(quit())); ViPerTCPMessage *message = new ViPerTCPMessage(); QByteArray input; QByteArray tempsize; qint32 size=0; int i=0; send_0x0403(); while(1) { MySocket->waitForReadyRead(1000); while(MySocket->bytesAvailable()>8) { tempsize=MySocket->read(4); for(i=0;i<4;i++) { size = size << 8; size+=tempsize[i]; } QByteArray code = MySocket->read(4); message->clear(); input.clear(); input.append(tempsize); input.append(code); input.append(MySocket->read(size)); message->SetMessage(input); select_answer(message); } } }
Partager