Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Solved QThread and pointers

    General and Desktop
    qthread pointer
    3
    12
    4212
    Loading More Posts
    • 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.
    • beecksche
      beecksche last edited by

      Hi,
      i have a question about QThread and pointers. I move my worker object to a created QThread (https://forum.qt.io/topic/66408/qthread-in-main-function). In the worker object there a pointers to other objects. These objects are created in a slot (so they are in a separate thread). Some pointers are shared with other objects.

      I'm not sure in which thread the pointers live in and if this is allowed or can occure some errors.

      My code looks like this

      class WorkerObject: public QObject
      {
          Q_OBJECT
      
      public Q_SLOTS:
          void createMembers() // create objects in a other thread
          {
              m_myObject1 = new MyObject1();
              QObject::connect(this, &QObject::destroyed, m_myObject1, &Qbject::deleteLater);
      
              m_myObject2 = new MyObject2(m_myObject1);
              QObject::connect(this, &QObject::destroyed, m_myObject2, &Qbject::deleteLater);
      
              ...
          }
      
      private:
          MyObject1 *m_myObject1;
          MyObject2 *m_myObject2;
          ...
      };
      
      
      1 Reply Last reply Reply Quote 0
      • jsulm
        jsulm Lifetime Qt Champion last edited by

        Is createMembers() called before or after you move the object to other thread?
        Do you use queued connection?
        Is it necessary to create these objects on the heap via new?

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

        1 Reply Last reply Reply Quote 0
        • beecksche
          beecksche last edited by

          CreateMembers() is called after i moved the workobject to the thread.

          The connection type is set to Qt::AutoConnection.

          Yes, i need them in some other slots again.

          kshegunov 1 Reply Last reply Reply Quote 0
          • jsulm
            jsulm Lifetime Qt Champion last edited by

            Then it should be OK.
            The slot is executed in the thread where the object resides, so the objects are created in the same thread.
            Regarding sharing the pointers with other objects: in which thread are those other objects?

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

            1 Reply Last reply Reply Quote 0
            • beecksche
              beecksche last edited by beecksche

              The other objects are also created in the createMembers() slot.

              So i can use the shared pointers in the other objects safely, because the objects "live" in the same thread, right?

              1 Reply Last reply Reply Quote 0
              • kshegunov
                kshegunov Moderators @beecksche last edited by

                @beecksche said:

                CreateMembers() is called after i moved the workobject to the thread.

                It makes a whole lot of difference how you call it. Is it connected to a signal, do you call it explicitly?

                Read and abide by the Qt Code of Conduct

                1 Reply Last reply Reply Quote 0
                • beecksche
                  beecksche last edited by

                  Sorry, i haven't told you yet. It's connected to a signal!

                  kshegunov 1 Reply Last reply Reply Quote 0
                  • kshegunov
                    kshegunov Moderators @beecksche last edited by

                    @beecksche
                    Then it's perfectly fine.

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply Reply Quote 0
                    • beecksche
                      beecksche last edited by

                      Perfect, thanks a lot!

                      kshegunov 1 Reply Last reply Reply Quote 0
                      • kshegunov
                        kshegunov Moderators @beecksche last edited by

                        @beecksche
                        No worries.
                        Although,QScopedPointer might be appropriate here (looking at your code), you may want to check it out.

                        Read and abide by the Qt Code of Conduct

                        1 Reply Last reply Reply Quote 0
                        • beecksche
                          beecksche last edited by beecksche

                          The advatage of a QScopedPointer is that you don't have to care about the destruction of the object, right?
                          The object will be destroyed when the pointer is out of scope?

                          kshegunov 1 Reply Last reply Reply Quote 0
                          • kshegunov
                            kshegunov Moderators @beecksche last edited by

                            @beecksche said:

                            The advatage of a QScopedPointer is that you don't have to care about the destruction of the object, right?

                            Yes. It's a thin wrapper around the raw pointer and will delete the held reference when it goes out of scope. The idea is to use the stack based QScopedPointer object to manage the heap-allocated object it's referencing.

                            Kind regards.

                            Read and abide by the Qt Code of Conduct

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post