Unsolved QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
-
I have this code:
pool.h#ifndef POOL_H #define POOL_H #include<QObject> #include<QThread> #include<QTcpSocket> #include<QDateTime> #include<QElapsedTimer> class Pool : public QThread { Q_OBJECT protected: void run(); private: struct conn{ QTcpSocket *s; QTime qdt; }; QList<conn> x; public: void add(QTcpSocket *s, QTime qdt); }; #endif // POOL_H
pool.cpp
#include "pool.h" #include <QElapsedTimer> void Pool::run() { QElapsedTimer qet; qet.start(); while (true) { if(qet.elapsed()>=5000){ foreach (conn y, x) { y.s->write("test"); y.s->flush(); } qet.restart(); } } } void Pool::add(QTcpSocket *s, QTime qdt){ conn c; c.s=s; c.qdt=qdt; x.append(c); }
part of myserver.h:
#include "myserver.h" Pool p; MyServer::MyServer(QObject *parent) : QObject(parent) { server = new QTcpServer(this); p.start(); connect(server, SIGNAL(newConnection()), this, SLOT(newConnection())); if(!server->listen(QHostAddress::Any, 1234)) { qDebug() << "Server could not start!"; } else { qDebug() << "Server started!"; } } void MyServer::newConnection() { QTcpSocket *socket = server->nextPendingConnection(); connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead())); socket->write("hello client\r\n"); socket->flush(); socket->waitForBytesWritten(3000); QDateTime qdt; p.add(socket, qdt.time()); }
And I get this error:
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
The code itself works, but I don't know, why I am getting this error/warning. -
Hi,
Based on your code, you are moving socket between threads which you should not.
See the threaded fortune server example.
-
I have read that, but I don't know how to fix it. Is it only possible to remove this warning?
-
@rktech said in QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread:
Is it only possible to remove this warning?
You should fix the issue instead of removing the warning!
Did you check the example @SGaist gave you? -
@jsulm As I have written, I have read it, but I don't know, how to fix my code.
-
@rktech said in QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread:
but I don't know, how to fix my code.
As shown in the example pass the socket fd instead the object to your thread. You have to override incomingConnection() as shown there.
-
@Christian-Ehrlicher I have read the example like three-times, but I still don't know how to fix it. Can you help me?
-
@rktech said in QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread:
but I still don't know how to fix it.
You have to override incomingConnection() as shown there.
-
@Christian-Ehrlicher said in QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread:
@rktech said in QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread:
but I still don't know how to fix it.
You have to override incomingConnection() as shown there.
I have tried, but I don't know how to implement that into my code.
-
What exactly have you tried ?
-
@SGaist To add override to my code, but I don't know where should I place it...
-
@SGaist How can I send the connection from incomingConnection() to Pool?
-
@SGaist I have successfully overrided the incomingconnection(), but I don't know, how to pass it to the Pool.
-
You'll have to redesign your pool a bit to ensure that your sockets are created in the context of the run method of your QThread subclass.
-
@SGaist I know, but how?
-
You have to transfer the descriptor to your pool and there in your run method create new sockets when descriptors are added.
-
@SGaist Should I add this part of code to my Pool::add() method? (Of course with editing it)
QTcpSocket tcpSocket; if (!tcpSocket.setSocketDescriptor(socketDescriptor)) { emit error(tcpSocket.error()); return; }
-
@SGaist I have (probably) successfully rewritten the Pool add method, but I have another problem. When I add this:
protected: void incomingConnection(qintptr socketDescriptor) override;
to myserver.h I get this error:
...\myserver.h:35: Chyba: only virtual member functions can be marked 'override'
(Chyba is Error in my local)
What I am doing wrong? -
Hi
well it is virtual https://doc.qt.io/qt-5/qtcpserver.html#incomingConnection
so does Pool inherit QTcpServer ?
The error you get says "Hey, i dont see that funtion in base class, so you cant use override" -
@mrjj No, the server is build under the myserver class