Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
Qt 6.11 is out! See what's new in the release blog

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

Scheduled Pinned Locked Moved Unsolved General and Desktop
33 Posts 5 Posters 31.7k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Christian EhrlicherC Christian Ehrlicher

    Sorry but please learn C++ first. If you want to override a function from a class you should inherit from this class. So inherit from QTcpServer, override the function and do whatever you want to. This is basic c++ stuff...

    R Offline
    R Offline
    rktech
    wrote on last edited by
    #24

    @Christian-Ehrlicher That's the thing, that I didn't notice. Thanks

    1 Reply Last reply
    0
    • Christian EhrlicherC Christian Ehrlicher

      Sorry but please learn C++ first. If you want to override a function from a class you should inherit from this class. So inherit from QTcpServer, override the function and do whatever you want to. This is basic c++ stuff...

      R Offline
      R Offline
      rktech
      wrote on last edited by
      #25

      @Christian-Ehrlicher But I don't know, how to edit it.

      1 Reply Last reply
      0
      • R Offline
        R Offline
        rktech
        wrote on last edited by
        #26

        I have rewritten half of my project to solve the problem:
        myserver.h

        #ifndef MYSERVER_H
        #define MYSERVER_H
        #include <QStringList>
        #include <QTcpServer>
        #include <QDateTime>
        class MyServer : public QTcpServer
        {
            Q_OBJECT
        
        public:
            MyServer(QObject *parent = nullptr);
        
        protected:
            void incomingConnection(qintptr socketDescriptor) override;
        
        private:
            QStringList fortunes;
        };
        
        #endif // MYSERVER_H
        

        myserver.cpp

        #include "myserver.h"
        #include "pool.h"
        Pool p;
        
        MyServer::MyServer(QObject *parent)
            : QTcpServer(parent)
        {
            p.start();
        }
        
        void MyServer::incomingConnection(qintptr socketDescriptor)
        {
        QDateTime qdt;
        p.add(socketDescriptor,qdt.time());
        }
        

        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(int socketDescriptor, 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) {
                    if(y.s==nullptr){
                        qDebug()<<"empty";
                        continue;
                    }
                    y.s->write("test");
                    y.s->flush();
                }
                qet.restart();
            }
        }
        }
        void Pool::add(int socketDescriptor, QTime qdt){
        QTcpSocket* s = new QTcpSocket;
        s->setSocketDescriptor(socketDescriptor);
        s->write("1\n");
        conn c;
        c.s=s;
        c.qdt=qdt;
        x.append(c);
        }
        

        But I have still the same error:

        QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
        

        What's wrong?

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #27

          Because your add method is called in the thread of the tcp server.

          As I already told you, the socket creation must happen in the run function.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          R 1 Reply Last reply
          1
          • SGaistS SGaist

            Because your add method is called in the thread of the tcp server.

            As I already told you, the socket creation must happen in the run function.

            R Offline
            R Offline
            rktech
            wrote on last edited by
            #28

            @SGaist I have solved it. I am creating a list of descriptors in add() method and then rewriting it like this:
            pool.cpp

            void Pool::run()
            {
            QElapsedTimer qet;
            qet.start();
            while (true) {
                if(!d.empty()){
                    qDebug()<<"rewriting";
                    for (int i = 0; i<d.size();i++) {
                        desc des = d[i];
                        conn con;
                        QTcpSocket* soc = new QTcpSocket;
                        soc->setSocketDescriptor(des.descriptor);
                        con.s=soc;
                        con.qdt=des.qt;
                        d.removeAt(i);
                        x.append(con);
                    }
                    qDebug()<<"done";
                }
                if(qet.elapsed()>=5000){
                    foreach (conn y, x) {
                        if(!y.s->isOpen()){
                            qDebug()<<"empty";
                            continue;
                        }
                        y.s->write("test");
                        qDebug()<<"l";
                        y.s->flush();
                    }
                    qet.restart();
                }
            }
            }
            void Pool::add(int socketDescriptor, QTime qdt){
            desc de;
            de.descriptor=socketDescriptor;
            de.qt=qdt;
            d.append(de);
            }
            

            definitions of structs and lists in pool.h:

              struct conn{
                    QTcpSocket *s;
                    QTime qdt;
                };
                struct desc{
                    qintptr descriptor;
                    QTime qt;
                };
                QList<conn> x;
                QList<desc> d;
            
            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #29

              You are missing one important thing: you are accessing a resource from two different threads. You should protect its access accordingly.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              R 1 Reply Last reply
              1
              • SGaistS SGaist

                You are missing one important thing: you are accessing a resource from two different threads. You should protect its access accordingly.

                R Offline
                R Offline
                rktech
                wrote on last edited by
                #30

                @SGaist In my last code it is fixed, right? If no, how to protect it correctly?

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #31

                  When using a new technology it's always a good idea to start by reading the documentation.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  R 1 Reply Last reply
                  1
                  • SGaistS SGaist

                    When using a new technology it's always a good idea to start by reading the documentation.

                    R Offline
                    R Offline
                    rktech
                    wrote on last edited by
                    #32

                    @SGaist I have read it, but I didn't catch what should I edit in my code.

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #33

                      Did you read the Synchronizing Threads chapter linked in it ?

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      1

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved