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. Issue with the thread
Forum Updated to NodeBB v4.3 + New Features

Issue with the thread

Scheduled Pinned Locked Moved Unsolved General and Desktop
21 Posts 5 Posters 2.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.
  • jsulmJ jsulm

    @Kira said in Issue with the thread:

    connect(processFrame, SIGNAL(finished()), processFrame, SLOT(requestReWork()));

    Actually this thread should not finish until you terminate it. Instead it should wait for new work package coming in via signal/slot.

    KiraK Offline
    KiraK Offline
    Kira
    wrote on last edited by
    #11

    @jsulm : I think i have figured where exactly the issue is:
    If suppose the processFrame thread is working camera request a frame and processframe haven't finished working. Below signal will will be generated:
    connect(workerPrimaryCamera,SIGNAL(workRequested()), threadPrimaryCamera, SLOT(start()),Qt::DirectConnection);
    And since it is Qt::DirectConnection it will immediately try to invoke slot causing a conflict and somehow cause a crash.
    What do you think ?
    Actually as per my program requirements i have to get the frame from the camera when demanded.
    I can continuously fetch the frame in a thread but it is not acceptable as there are chances of getting older frame.
    Can you please suggest any sophisticated way to implement the same.
    Thanks

    jsulmJ J.HilkJ 2 Replies Last reply
    0
    • KiraK Kira

      @jsulm : I think i have figured where exactly the issue is:
      If suppose the processFrame thread is working camera request a frame and processframe haven't finished working. Below signal will will be generated:
      connect(workerPrimaryCamera,SIGNAL(workRequested()), threadPrimaryCamera, SLOT(start()),Qt::DirectConnection);
      And since it is Qt::DirectConnection it will immediately try to invoke slot causing a conflict and somehow cause a crash.
      What do you think ?
      Actually as per my program requirements i have to get the frame from the camera when demanded.
      I can continuously fetch the frame in a thread but it is not acceptable as there are chances of getting older frame.
      Can you please suggest any sophisticated way to implement the same.
      Thanks

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

      @Kira said in Issue with the thread:

      Qt::DirectConnection

      I don't think this is a good idea when connecting signals/slots between different threads, should be queued connection.

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

      1 Reply Last reply
      0
      • KiraK Kira

        @jsulm : I think i have figured where exactly the issue is:
        If suppose the processFrame thread is working camera request a frame and processframe haven't finished working. Below signal will will be generated:
        connect(workerPrimaryCamera,SIGNAL(workRequested()), threadPrimaryCamera, SLOT(start()),Qt::DirectConnection);
        And since it is Qt::DirectConnection it will immediately try to invoke slot causing a conflict and somehow cause a crash.
        What do you think ?
        Actually as per my program requirements i have to get the frame from the camera when demanded.
        I can continuously fetch the frame in a thread but it is not acceptable as there are chances of getting older frame.
        Can you please suggest any sophisticated way to implement the same.
        Thanks

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

        @Kira said in Issue with the thread:

        And since it is Qt::DirectConnection it will immediately try to invoke slot causing a conflict and somehow cause a crash.
        What do you think ?

        it's worse than that, with a forced DirectConnection, the SLOT is executed in the calling thread.

        Without any QMutex or similar, this is highly likely the cause of your problems.


        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
        2
        • BuckwheatB Offline
          BuckwheatB Offline
          Buckwheat
          wrote on last edited by
          #14

          Hi @Kira !

          Yes, the Qt::DirectConnection is a problem with threads. You should make sure you are using the Qt::QueuedConnection and that you are passing a buffer of data that the processing thread can take ownership of and destroy when finished. I like to use QSharedData/QSharedDataPointer so the cleanup is scoped and easy.

          The nice thing about queued connections is that mutexing can be minimal when using the QSharedData/QSharedDataPointer (if at all) and the data will "queue" up so you can access it as fast as you need to.

          I process hundreds of GNSS and CAN messages per second so you should be OK.

          Dave Fileccia

          kshegunovK 1 Reply Last reply
          1
          • BuckwheatB Buckwheat

            Hi @Kira !

            Yes, the Qt::DirectConnection is a problem with threads. You should make sure you are using the Qt::QueuedConnection and that you are passing a buffer of data that the processing thread can take ownership of and destroy when finished. I like to use QSharedData/QSharedDataPointer so the cleanup is scoped and easy.

            The nice thing about queued connections is that mutexing can be minimal when using the QSharedData/QSharedDataPointer (if at all) and the data will "queue" up so you can access it as fast as you need to.

            I process hundreds of GNSS and CAN messages per second so you should be OK.

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by kshegunov
            #15

            @Buckwheat said in Issue with the thread:

            Yes, the Qt::DirectConnection is a problem with threads.

            I object to that statement! I have a 5 years old or so C++ syntax parser that is threaded and uses direct connections exclusively. I would argue that one should know what Qt::DirectConnection implies, however. Same goes for Qt::QueuedConnection - just mindlessly using queued calls over whatever thread the objects happen to be in means you're just as mindlessly copying data around without a reason. What one should default to is the default - Qt::AutoConnection, and use a direct or a queued connection when and only when that's what is exactly, explicitly, supposed to happen.

            Read and abide by the Qt Code of Conduct

            BuckwheatB 1 Reply Last reply
            0
            • KiraK Offline
              KiraK Offline
              Kira
              wrote on last edited by
              #16

              @jsulm @J-Hilk @Buckwheat @kshegunov :
              Guys thanks for response. I problem seems to be with camera thread. Please have a look over the connections:
              connect(camera,SIGNAL(workRequested()), threadCamera, SLOT(start()),Qt::DirectConnection);
              connect(threadCamera, SIGNAL(started()), camera, SLOT(doWork()),Qt::DirectConnection);
              connect(camera,SIGNAL(frame(cv::Mat)),this,SLOT(updateFrame(cv::Mat)),Qt::DirectConnection);
              connect(camera, SIGNAL(finished()),threadCamera,SLOT(quit()),Qt::DirectConnection);

              I am following the following approch:
              Constructor:
              camera->moveToThread(threadCamera);
              Main Program:
              camera->requestWork() // At this point i initialite the thread to fetch frame
              what is did after few miiliseconds i again called camera->requestWork() without checking whether
              previous thread have been stopped.
              As i have used Qt::DirectConnection in all my slots other the first thread used to work forcing other thread to wait but this logic seems to fail at certain instance of time and the program would crash.
              If i remove Qt::DirectConnection the slots don't respond.

              1. Please let me know correct way in which i can call the thread ?
              2. Is not correct to call camera->workRequest multiple time ?
              3. Does calling camera->workRequest multiple time creates multiple instance or same thread instance is called everytime?
              kshegunovK 1 Reply Last reply
              0
              • KiraK Kira

                @jsulm @J-Hilk @Buckwheat @kshegunov :
                Guys thanks for response. I problem seems to be with camera thread. Please have a look over the connections:
                connect(camera,SIGNAL(workRequested()), threadCamera, SLOT(start()),Qt::DirectConnection);
                connect(threadCamera, SIGNAL(started()), camera, SLOT(doWork()),Qt::DirectConnection);
                connect(camera,SIGNAL(frame(cv::Mat)),this,SLOT(updateFrame(cv::Mat)),Qt::DirectConnection);
                connect(camera, SIGNAL(finished()),threadCamera,SLOT(quit()),Qt::DirectConnection);

                I am following the following approch:
                Constructor:
                camera->moveToThread(threadCamera);
                Main Program:
                camera->requestWork() // At this point i initialite the thread to fetch frame
                what is did after few miiliseconds i again called camera->requestWork() without checking whether
                previous thread have been stopped.
                As i have used Qt::DirectConnection in all my slots other the first thread used to work forcing other thread to wait but this logic seems to fail at certain instance of time and the program would crash.
                If i remove Qt::DirectConnection the slots don't respond.

                1. Please let me know correct way in which i can call the thread ?
                2. Is not correct to call camera->workRequest multiple time ?
                3. Does calling camera->workRequest multiple time creates multiple instance or same thread instance is called everytime?
                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by
                #17

                @Kira said in Issue with the thread:

                If i remove Qt::DirectConnection the slots don't respond.

                You're blocking the event loop for that to occur. Don't block the event loop and you're going to be fine. Search the forums, I, personally, have written many posts on that particular topic, so the information is in there.

                Read and abide by the Qt Code of Conduct

                KiraK 1 Reply Last reply
                2
                • kshegunovK kshegunov

                  @Kira said in Issue with the thread:

                  If i remove Qt::DirectConnection the slots don't respond.

                  You're blocking the event loop for that to occur. Don't block the event loop and you're going to be fine. Search the forums, I, personally, have written many posts on that particular topic, so the information is in there.

                  KiraK Offline
                  KiraK Offline
                  Kira
                  wrote on last edited by Kira
                  #18

                  @kshegunov : I have diabled my tensorflow library for my debugger to work.
                  I am getting the following exception from the thread.

                  0_1559540018003_c1cd8e53-93fc-4d9c-853a-a47154b896ee-image.png

                  Add debugger shows error at following line of alloc.h:
                  uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);

                  kshegunovK 1 Reply Last reply
                  0
                  • KiraK Kira

                    @kshegunov : I have diabled my tensorflow library for my debugger to work.
                    I am getting the following exception from the thread.

                    0_1559540018003_c1cd8e53-93fc-4d9c-853a-a47154b896ee-image.png

                    Add debugger shows error at following line of alloc.h:
                    uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);

                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by
                    #19

                    With 98% certainty you have an infinite recursion somewhere. Where and how is beyond me.

                    Read and abide by the Qt Code of Conduct

                    KiraK 1 Reply Last reply
                    0
                    • kshegunovK kshegunov

                      With 98% certainty you have an infinite recursion somewhere. Where and how is beyond me.

                      KiraK Offline
                      KiraK Offline
                      Kira
                      wrote on last edited by
                      #20

                      @kshegunov : Finally resolved and learnt the importance of debugger in life.
                      I just commented the tensorflow lib which was a release mode lib and was causing the gdb error.

                      Exact Issue:
                      I have created a QPair which in which i inserted a image with a processed flag set to false.
                      My tread whereas in background would run independently and try to process the image and set the processed flag to true.
                      There was a condition in my loop where led the thread to access a certain location which was not present in the QPair list and caused the trigger to terminate abnormally.
                      Thanks to the debugger the issue was clear.

                      1 Reply Last reply
                      1
                      • kshegunovK kshegunov

                        @Buckwheat said in Issue with the thread:

                        Yes, the Qt::DirectConnection is a problem with threads.

                        I object to that statement! I have a 5 years old or so C++ syntax parser that is threaded and uses direct connections exclusively. I would argue that one should know what Qt::DirectConnection implies, however. Same goes for Qt::QueuedConnection - just mindlessly using queued calls over whatever thread the objects happen to be in means you're just as mindlessly copying data around without a reason. What one should default to is the default - Qt::AutoConnection, and use a direct or a queued connection when and only when that's what is exactly, explicitly, supposed to happen.

                        BuckwheatB Offline
                        BuckwheatB Offline
                        Buckwheat
                        wrote on last edited by
                        #21

                        @kshegunov said in Issue with the thread:

                        @kshegunov I am glad you take offense. But, the default behavior for connection seems to be queued connection when crossing thread boundaries. I have found NO exception to this in the last 7 years so obviously the Qt designers thought there might be a problem. This queuing is why you can Q_EMIT data from a thread and put it into a GUI control which can only be done from the main thread. Also, I just said "Qt::QueuedConnection is no problems with threads". I would assume he is using the defaults in his thread.

                        As for copying, Sending a QSharedDataPointer is 4 bytes and is reference counted. NO COPYING except a pointer. Please read carefully before making "mindlessly" making judgements.

                        As 99% of my posts say, it is all in your design. Know what you are doing and what protections are offered. If you need to queue packets, QSharedDataPointer is great and it manages the pointers properly.

                        So, in summary, feel as offended as you like. It is a free forum and we can react how we like!

                        Dave Fileccia

                        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