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. Camera class in QThread
Forum Updated to NodeBB v4.3 + New Features

Camera class in QThread

Scheduled Pinned Locked Moved Solved General and Desktop
11 Posts 4 Posters 1.3k Views 1 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.
  • C Offline
    C Offline
    Creatorczyk
    wrote on last edited by Creatorczyk
    #1

    Hi,

    I woluld like to implement the Camera class in a separate thread to be able to independently retrieve data from a device and process it in the run() method. Unfortunately, when calling the run() method, the code gets stuck in a loop and won't come out. As a result, I cannot stop the camera with the stop() method. How could I fix that?

    camera.h:

    class Camera : public QThread
    {
        Q_OBJECT
    public:
        Camera();
        ~Camera() {}
    
        void run();
        void stop() { camera_running = false; }
    
    private:
        rs2::config cfg;
        rs2::pipeline pipe;
        rs2::frameset frames;
        bool camera_running;
    
    signals:
        void FrameReady(rs2::depth_frame frame);
    };
    

    camera.cpp:

    Camera::Camera()
    {
        camera_running = true;
      
        cfg.enable_stream(RS2_STREAM_DEPTH,
                          CAMERA::RESOLUTION::DEPTH_WIDTH,
                          CAMERA::RESOLUTION::DEPTH_HIGHT,
                          RS2_FORMAT_Z16,
                          CAMERA::FPS);
    
        pipe.start(cfg);
    }
    void Camera::run()
    {
        while(!this->isInterruptionRequested())
        {
            try{
                frames = pipe.wait_for_frames();
                rs2::depth_frame depth = frames.get_depth_frame();
               emit FrameReady(depth);
            }
            catch(const rs2::error& e)
            {
                std::cout << "ERROR: " << e.get_failed_function() << "(" <<e.get_failed_args() <<")    "<<e.what()<<std::endl;
            }
        }
    }
    

    main.cpp:

    QThread cameraThread;
        Camera *camera = new Camera();
        QObject::connect(camera, &Camera::FrameReady, mqttClient, &MqttClient::sendFrame);
        camera->moveToThread(&cameraThread);
        camera->run();
        qDebug()<<"Started";  //Will not be done
        camera->stop(); //Will not be done
        qDebug()<<"Stopped"; //Will not be done
    
    1 Reply Last reply
    0
    • S Offline
      S Offline
      stryga42
      wrote on last edited by stryga42
      #2

      I think the problem is that you call run directly from your GUI thread - this is a simple (blocking) call, not the start of a new thread. You should call start() on your camera object, I guess.
      Edit: Your have two QThread objects - cameraThread and camera (which is derived from QThread) why? You mix the two options to use QThread (moving a worker object to QThread or reimplementing QThread::run(). )

      C 1 Reply Last reply
      1
      • S stryga42

        I think the problem is that you call run directly from your GUI thread - this is a simple (blocking) call, not the start of a new thread. You should call start() on your camera object, I guess.
        Edit: Your have two QThread objects - cameraThread and camera (which is derived from QThread) why? You mix the two options to use QThread (moving a worker object to QThread or reimplementing QThread::run(). )

        C Offline
        C Offline
        Creatorczyk
        wrote on last edited by
        #3

        @stryga42 If I change the inheritance from QThread to QObject, nothing will change

        Christian EhrlicherC 1 Reply Last reply
        0
        • C Creatorczyk

          @stryga42 If I change the inheritance from QThread to QObject, nothing will change

          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Creatorczyk Since you don't start the thread anywhere nothing happens.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          C 1 Reply Last reply
          1
          • Christian EhrlicherC Christian Ehrlicher

            @Creatorczyk Since you don't start the thread anywhere nothing happens.

            C Offline
            C Offline
            Creatorczyk
            wrote on last edited by
            #5

            @Christian-Ehrlicher I change code in main.cpp to:

            QThread cameraThread;
                Camera *camera = new Camera();
                QObject::connect(camera, &Camera::FrameReady, mqttClient, &MqttClient::sendFrame);
                camera->moveToThread(&cameraThread);
                cameraThread.start();
                camera->run();
                qDebug()<<"Started";   //Will not be done
                camera->stop();   //Will not be done
                qDebug()<<"Stopped";   //Will not be done
            

            Unfortunately nothing happened. Futher code does not execute

            Christian EhrlicherC S 2 Replies Last reply
            0
            • C Creatorczyk

              @Christian-Ehrlicher I change code in main.cpp to:

              QThread cameraThread;
                  Camera *camera = new Camera();
                  QObject::connect(camera, &Camera::FrameReady, mqttClient, &MqttClient::sendFrame);
                  camera->moveToThread(&cameraThread);
                  cameraThread.start();
                  camera->run();
                  qDebug()<<"Started";   //Will not be done
                  camera->stop();   //Will not be done
                  qDebug()<<"Stopped";   //Will not be done
              

              Unfortunately nothing happened. Futher code does not execute

              Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @Creatorczyk Again: you don't start your thread anywhere, you just call a function named run() in your Camera object - nothing more.

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              C 1 Reply Last reply
              1
              • Christian EhrlicherC Christian Ehrlicher

                @Creatorczyk Again: you don't start your thread anywhere, you just call a function named run() in your Camera object - nothing more.

                C Offline
                C Offline
                Creatorczyk
                wrote on last edited by
                #7

                @Christian-Ehrlicher calling "cameraThread.start();" will not start thread?

                Christian EhrlicherC jsulmJ 2 Replies Last reply
                0
                • C Creatorczyk

                  @Christian-Ehrlicher calling "cameraThread.start();" will not start thread?

                  Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @Creatorczyk It will, but then you call a blocking function in your main thread.

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  1 Reply Last reply
                  0
                  • C Creatorczyk

                    @Christian-Ehrlicher I change code in main.cpp to:

                    QThread cameraThread;
                        Camera *camera = new Camera();
                        QObject::connect(camera, &Camera::FrameReady, mqttClient, &MqttClient::sendFrame);
                        camera->moveToThread(&cameraThread);
                        cameraThread.start();
                        camera->run();
                        qDebug()<<"Started";   //Will not be done
                        camera->stop();   //Will not be done
                        qDebug()<<"Stopped";   //Will not be done
                    

                    Unfortunately nothing happened. Futher code does not execute

                    S Offline
                    S Offline
                    stryga42
                    wrote on last edited by
                    #9

                    @Creatorczyk

                    cameraThread.start();
                    

                    is the right thing to do. Yes, this starts a new thread "within" the object cameraThread. This call to start() does not block. Check it it out by inserting a qDebug() output right after the call.
                    But then you call (unnecessarily) Camera::run(), which will block. Use signals to "trigger" your camera object. Again, I think you mix up the two ways to use QThread: Usually you EITHER use the "moveToTrhread-style" OR the "reimplement QThread::run-style", but not both at the same time. If you want your code in Camera::run() to be executed without signaling, you have to call start() on your (then QThread derived) Camera object. Som thing like

                    camera->start();
                    

                    should do the job. cameraThread is then not required at all.

                    1 Reply Last reply
                    1
                    • C Creatorczyk

                      @Christian-Ehrlicher calling "cameraThread.start();" will not start thread?

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      @Creatorczyk said in Camera class in QThread:

                      calling "cameraThread.start();" will not start thread?

                      Did you read https://doc.qt.io/qt-5/qthread.html#start ?
                      start() calls run() - you do not have to call run() by yourself and you should NOT!

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      2
                      • C Offline
                        C Offline
                        Creatorczyk
                        wrote on last edited by
                        #11

                        @stryga42 @Christian-Ehrlicher @jsulm Thanks, I fixed it!

                        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