Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QThread richtig einsetzen?
Forum Updated to NodeBB v4.3 + New Features

QThread richtig einsetzen?

Scheduled Pinned Locked Moved Solved German
39 Posts 3 Posters 19.6k Views
  • 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.
  • G Offline
    G Offline
    Galilio
    wrote on last edited by Galilio
    #29

    Guten morgen zusammen
    Problem wurde gelöst.
    ich habe es immer den falschen Thread benutzt und dazu versuche ich ihm zu löschen.
    danke
    @J-Hilk

    1 Reply Last reply
    1
    • J.HilkJ J.Hilk

      Guten Morgen @Galilio ,

      zu deinem letzten post:

      das Signal QThread::started wird nur dann ausgelöst wenn QThread bereit ist die EventLoop zu starten, also kurz bevor (intern) exec in run gecalled wird.

      Das passiert eigendlich nur einmal in der Lebenszeit des Threads.

      Ist nen Privates Signal, d.h. nur das QThread Object kann es auslösen, aber man kann sich von außerhalb an das Signal hängen, mit nem connect. Klick hier zum nachlesen

      Und das ist auch was im Beispiel passiert. Weil connect(workerThread, &QThread::started, workerObject, &Worker::init);eine Qt::Queuedconnection ist, wird init auf jedenfall erst dann ausgeführt, wenn die QThread eventloop läuft.

      Der Connecttyp ist nicht expliciet definiert -> Auto als standart -> Queuedconnection weil Threadübergreifend.

      Zu dem post davor,
      sieht so aus, als ob die Objecte im Constructor im original Thread erstellst und nicht mit verschiebst. Aber ohne Code ist da schwer was zu sagen, der Stacktrace sollte dir aufschluß darüber geben in welcher Zeile das passiert. Programm mal in Debug starten und gucken :-)

      G Offline
      G Offline
      Galilio
      wrote on last edited by
      #30
      This post is deleted!
      J.HilkJ 1 Reply Last reply
      0
      • G Galilio

        This post is deleted!

        J.HilkJ Online
        J.HilkJ Online
        J.Hilk
        Moderators
        wrote on last edited by
        #31

        @Galilio
        hi,

        Warum bestehst du eigentlich auf einer Synchronen TCPSocket Lösung? Wenn möglich sollte man immer die Asynchronen Funktionen nehmen.

        Das gesagt, waitForDisconnected hat in der docu den Beisatz

        Note: This function may fail randomly on Windows. Consider using the event loop and the disconnected() signal if your software will run on Windows.
        

        Also besondere Vorsicht die man hier walten lassen sollte.

        if ((GetTcpSocket()->state() == QAbstractSocket::UnconnectedState) || (GetTcpSocket()->waitForDisconnected(GetTimeOut())))
        

        ist an sich nicht falsch, der erste Parameter wird immer zuerst geprüft, und falls true, wird der Rest des IF-Statements ignoriert.
        Ist aber trotzdem eine blockierende Funktion und wird deinen Thread für bis zu 3 Sekunden, der default timeout, freezen.

        Ich würde es etwas anders lösen, und zwar über das Signal stateChanged vom TcpSocket

        connect(tcpSocket, &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState{
            if(socketState == ConnectedState)
               emit SocketConnected();
            if(socketState == UnconnectedState)
               emit SocketDisconnected();
        });
        

        einen Timeout kannst du dir ganz leicht selbst machen mit einem QTimer

        void disconnectMySocket(){
           tcpSocket->disconnectFromHost();
           QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected);
        }
        
        void checkDisconnected(){
           if(tcpSocket->state != UnconnectedState){
           //Error Handling
           }
        }
        

        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        G 2 Replies Last reply
        1
        • J.HilkJ J.Hilk

          @Galilio
          hi,

          Warum bestehst du eigentlich auf einer Synchronen TCPSocket Lösung? Wenn möglich sollte man immer die Asynchronen Funktionen nehmen.

          Das gesagt, waitForDisconnected hat in der docu den Beisatz

          Note: This function may fail randomly on Windows. Consider using the event loop and the disconnected() signal if your software will run on Windows.
          

          Also besondere Vorsicht die man hier walten lassen sollte.

          if ((GetTcpSocket()->state() == QAbstractSocket::UnconnectedState) || (GetTcpSocket()->waitForDisconnected(GetTimeOut())))
          

          ist an sich nicht falsch, der erste Parameter wird immer zuerst geprüft, und falls true, wird der Rest des IF-Statements ignoriert.
          Ist aber trotzdem eine blockierende Funktion und wird deinen Thread für bis zu 3 Sekunden, der default timeout, freezen.

          Ich würde es etwas anders lösen, und zwar über das Signal stateChanged vom TcpSocket

          connect(tcpSocket, &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState{
              if(socketState == ConnectedState)
                 emit SocketConnected();
              if(socketState == UnconnectedState)
                 emit SocketDisconnected();
          });
          

          einen Timeout kannst du dir ganz leicht selbst machen mit einem QTimer

          void disconnectMySocket(){
             tcpSocket->disconnectFromHost();
             QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected);
          }
          
          void checkDisconnected(){
             if(tcpSocket->state != UnconnectedState){
             //Error Handling
             }
          }
          
          G Offline
          G Offline
          Galilio
          wrote on last edited by
          #32

          @J.Hilk
          vielen dank
          Dein tipps sind super

          1 Reply Last reply
          0
          • J.HilkJ J.Hilk

            @Galilio
            hi,

            Warum bestehst du eigentlich auf einer Synchronen TCPSocket Lösung? Wenn möglich sollte man immer die Asynchronen Funktionen nehmen.

            Das gesagt, waitForDisconnected hat in der docu den Beisatz

            Note: This function may fail randomly on Windows. Consider using the event loop and the disconnected() signal if your software will run on Windows.
            

            Also besondere Vorsicht die man hier walten lassen sollte.

            if ((GetTcpSocket()->state() == QAbstractSocket::UnconnectedState) || (GetTcpSocket()->waitForDisconnected(GetTimeOut())))
            

            ist an sich nicht falsch, der erste Parameter wird immer zuerst geprüft, und falls true, wird der Rest des IF-Statements ignoriert.
            Ist aber trotzdem eine blockierende Funktion und wird deinen Thread für bis zu 3 Sekunden, der default timeout, freezen.

            Ich würde es etwas anders lösen, und zwar über das Signal stateChanged vom TcpSocket

            connect(tcpSocket, &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState{
                if(socketState == ConnectedState)
                   emit SocketConnected();
                if(socketState == UnconnectedState)
                   emit SocketDisconnected();
            });
            

            einen Timeout kannst du dir ganz leicht selbst machen mit einem QTimer

            void disconnectMySocket(){
               tcpSocket->disconnectFromHost();
               QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected);
            }
            
            void checkDisconnected(){
               if(tcpSocket->state != UnconnectedState){
               //Error Handling
               }
            }
            
            G Offline
            G Offline
            Galilio
            wrote on last edited by
            #33

            @J.Hilk
            Hi,

            Das

            void disconnectMySocket(){
               tcpSocket->disconnectFromHost();
               QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected);
            }
            
            void checkDisconnected(){
            // Diese Funktion wird aber ne aufgerufen
               if(tcpSocket->state != UnconnectedState){
               //Error Handling
               }
            }
            

            wird aber ne erreicht.

            J.HilkJ 1 Reply Last reply
            0
            • G Galilio

              @J.Hilk
              Hi,

              Das

              void disconnectMySocket(){
                 tcpSocket->disconnectFromHost();
                 QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected);
              }
              
              void checkDisconnected(){
              // Diese Funktion wird aber ne aufgerufen
                 if(tcpSocket->state != UnconnectedState){
                 //Error Handling
                 }
              }
              

              wird aber ne erreicht.

              J.HilkJ Online
              J.HilkJ Online
              J.Hilk
              Moderators
              wrote on last edited by
              #34

              @Galilio
              mit ziehmlicher sicherheit wird das aufgerufen x), Fehlermeldungen falls vorhanden immer mit posten.

              Ich hab das so vereinfacht geschrieben wie möglich, das muss an dein Programm angepasst werden.

              wenn die den Slot vermeiden möchtest kann man das auch in ein Lamda stecken.
              Das wird auf jeden Fall aufgerufen, oder zumindest wird der compiler abbrechen mit einer Fehlermeldung:

              void disconnectMySocket(){
                 tcpSocket->disconnectFromHost();
                 QTimer::singleShot(3000, this, [=]{
                     if(tcpSocket->state != UnconnectedState){
                         //Error Handling
                     }
                 });
              }
              

              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


              Q: What's that?
              A: It's blue light.
              Q: What does it do?
              A: It turns blue.

              1 Reply Last reply
              0
              • G Offline
                G Offline
                Galilio
                wrote on last edited by
                #35

                @J.Hilk
                aber wenn ich so schreibe :

                
                void disconnectMySocket(){
                   tcpSocket->disconnectFromHost();
                   QTimer::singleShot(3000, this, [=]{
                qDebug() << "checkDisonnected";
                       if(tcpSocket->state() != UnconnectedState){
                           //Error Handling
                       }
                   });
                }
                

                dann muss er rein aber der tut es nicht.

                Hier wird der SocketConnect bzw. SocketDisconnected emitted und das entsprechende Slot aufgerufen

                	connect(GetTcpSocket(), &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState) {
                		if (socketState == QAbstractSocket::ConnectedState)
                		{
                			qDebug() << "Connected";
                			emit SocketConnected();
                		}
                		if (socketState == QAbstractSocket::UnconnectedState)
                		{
                			qDebug() << "Disconnected";
                			emit SocketDisconnected();
                		}
                	});
                
                
                J.HilkJ 1 Reply Last reply
                0
                • G Galilio

                  @J.Hilk
                  aber wenn ich so schreibe :

                  
                  void disconnectMySocket(){
                     tcpSocket->disconnectFromHost();
                     QTimer::singleShot(3000, this, [=]{
                  qDebug() << "checkDisonnected";
                         if(tcpSocket->state() != UnconnectedState){
                             //Error Handling
                         }
                     });
                  }
                  

                  dann muss er rein aber der tut es nicht.

                  Hier wird der SocketConnect bzw. SocketDisconnected emitted und das entsprechende Slot aufgerufen

                  	connect(GetTcpSocket(), &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState) {
                  		if (socketState == QAbstractSocket::ConnectedState)
                  		{
                  			qDebug() << "Connected";
                  			emit SocketConnected();
                  		}
                  		if (socketState == QAbstractSocket::UnconnectedState)
                  		{
                  			qDebug() << "Disconnected";
                  			emit SocketDisconnected();
                  		}
                  	});
                  
                  
                  J.HilkJ Online
                  J.HilkJ Online
                  J.Hilk
                  Moderators
                  wrote on last edited by
                  #36

                  @Galilio said in QThread richtig einsetzen?:

                  disconnectMySocket()

                  setze mal einen Breakpoint oder eine qDebug() line um zu schaun, ob disconnectMySocket() überhaupt aufgerufen wird.


                  Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                  Q: What's that?
                  A: It's blue light.
                  Q: What does it do?
                  A: It turns blue.

                  1 Reply Last reply
                  0
                  • G Offline
                    G Offline
                    Galilio
                    wrote on last edited by Galilio
                    #37

                    Das habe ich gemacht.

                    disconnectMySocket()
                    

                    Dieses wird schon aufgerufen, aber

                    checkDisconnected()
                    

                    wird ne aufgerufen.

                    J.HilkJ 1 Reply Last reply
                    0
                    • G Galilio

                      Das habe ich gemacht.

                      disconnectMySocket()
                      

                      Dieses wird schon aufgerufen, aber

                      checkDisconnected()
                      

                      wird ne aufgerufen.

                      J.HilkJ Online
                      J.HilkJ Online
                      J.Hilk
                      Moderators
                      wrote on last edited by
                      #38

                      @Galilio mmh
                      #include <QTimer> ist gemacht? Clean Build durchgeführt? Eventuell ShadowBuild-Ordner löschen.


                      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                      Q: What's that?
                      A: It's blue light.
                      Q: What does it do?
                      A: It turns blue.

                      G 1 Reply Last reply
                      0
                      • J.HilkJ J.Hilk

                        @Galilio mmh
                        #include <QTimer> ist gemacht? Clean Build durchgeführt? Eventuell ShadowBuild-Ordner löschen.

                        G Offline
                        G Offline
                        Galilio
                        wrote on last edited by
                        #39

                        @J.Hilk

                        @J.Hilk said in QThread richtig einsetzen?:

                        @Galilio mmh
                        #include <QTimer> ist gemacht? Clean Build durchgeführt? Eventuell ShadowBuild-Ordner löschen.
                        habe ich gemacht

                        1 Reply Last reply
                        0

                        • Login

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