QTimer, QThread și mesajele TCP

Qt 4.8, Windows XP:

Am un fir care gestionează mesajele mele TCP și deschide/întreține/închide soclul la momentele corespunzătoare.

Același fir pornește un QTimer, 200 ms, definit în datele firului meu, care pompează un eveniment în clasa thread-ului meu o dată (dacă) soclul este deschis. Deci timerul și evenimentul său aparțin firului, pe măsură ce înțeleg cel mai bine ideea.

Evenimentul de expirare QTimer trimite un mesaj TCP prin portul aparținând firului, este un mesaj de tip "keep-alive" pentru acest element hardware particular. Trebuie să fie trimis în mod regulat sau dispozitivul "dispare", ceea ce nu va face.

Când mesajul este trimis, primesc această eroare:

"QSocketNotifier: notificatorii socket nu pot fi activate de la un alt thread"

Din câte vă pot spune, eu am trimiterea mesajului din același thread și vă așteptați ca toate semnalele etc. să fie deținute/prelucrate etc. de către acesta.

Poate cineva să-mi spună ce lipsește aici?

PS: mesajul este trimis , dispozitivul nu rămâne în viață ... doar că primesc această eroare de execuție pe consola de eroare Qt și sunt foarte îngrijorat că există probleme interne care se ascund din cauza ei.

Mesajul NU apare rulat sub OS X 10.6. Nu știu de ce.

0

1 răspunsuri

Bine, iată scoica. QTimer, din motive cunoscute doar designerilor QT, moștenește contextul părintelui firului. Nu contextul thread-ului lansat de la. Deci, când cronometrul se stinge și trimiteți un mesaj din slotul pe care la numit, nu sunteți în contextul firului, sunteți în contextul părinților.

De asemenea, nu puteți lansa un fir care este copilul acelui thread, astfel încât să puteți declanșa un cronometru care va fi de fapt în firul pe care îl doriți. Qt nu va lăsa să ruleze.

Așadar, petreceți o memorie, faceți o coadă, încărcați mesajul în coada de așteptare din altă parte, urmăriți coada în firul care deține portul TCP și trimiteți-i em când le-ați primit. Asta merge.

0
adăugat
+1 Acest răspuns mi-ar fi putut salva slujba, nu glumesc! Puteți să-mi spuneți dacă acest lucru rămâne în Qt5? Și, de asemenea, puteți să vă prezentați în detaliu unde este descris acest document? Mulțumiri!
adăugat autor Lennart Rolland, sursa
De fapt, am constatat că QTimer nu moștește cotextul părintelui firului în Qt5 (nu știu despre Qt4.x). Dar trebuie să vă asigurați că QTimerul este mutat împreună cu obiectul muncitor făcându-l copil al muncitorului sau creând-o în noul context. Consultați acest post util: qt-project.org/forums/viewthread/21141
adăugat autor Lennart Rolland, sursa