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. QTimer::singleShot()'s syntax
Forum Updated to NodeBB v4.3 + New Features

QTimer::singleShot()'s syntax

Scheduled Pinned Locked Moved Solved General and Desktop
34 Posts 9 Posters 12.1k Views 4 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.
  • JKSHJ JKSH

    @agarny said in QTimer::singleShot()'s syntax:

    Anyway, I appreciate that it could be improved when it comes thread safety, and I will make sure that it is. FWIW, I did, at some point, rely on the signal/slot mechanism for my worker, but it slowed things down quite a bit, hence I went for the approach I have just described above.

    See http://doc.qt.io/qt-5/threads-synchronizing.html It sounds like the high-level approach slows things down noticeably for you, so go with the low-level ones instead.

    A Offline
    A Offline
    agarny
    wrote on last edited by
    #25

    @JKSH said in QTimer::singleShot()'s syntax:

    See http://doc.qt.io/qt-5/threads-synchronizing.html It sounds like the high-level approach slows things down noticeably for you, so go with the low-level ones instead.

    Yes, I am already using low-level synchronization primitives in parts of my code, and this is the approach I am thinking of taking here too.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      agarny
      wrote on last edited by
      #26

      Ok, on further investigation, the symptom described in my original message is not the result of a race condition. I agree that it is not to say that my code is free of race conditions, although I am relatively confident that it is. Not so much because of the quality of my code, but rather because of the way it is used. Now, I know it's not great, but that's the compromise I had to make for my code to be as fast as possible, something that is important for my application.

      Anyway, among other things, my application can "run" mathematical models and, until recently, it could only render one run at a time. Recently, I have modified my application so that it could render multiple runs and this is where the problem was. I wasn't properly handling multiple runs and because of the low overhead associated with the new QTimer::singleShot syntax (compared with the old syntax), my application didn't render the end of some runs. I now "properly" handle multiple runs and everything works as expected (see here for those who had a look at my code before).

      So, thanks all for your feedback, it was much appreciated. (Thanks @VRonin for your std::bind() suggestion, which I now use.)

      aha_1980A 1 Reply Last reply
      0
      • A agarny

        Ok, on further investigation, the symptom described in my original message is not the result of a race condition. I agree that it is not to say that my code is free of race conditions, although I am relatively confident that it is. Not so much because of the quality of my code, but rather because of the way it is used. Now, I know it's not great, but that's the compromise I had to make for my code to be as fast as possible, something that is important for my application.

        Anyway, among other things, my application can "run" mathematical models and, until recently, it could only render one run at a time. Recently, I have modified my application so that it could render multiple runs and this is where the problem was. I wasn't properly handling multiple runs and because of the low overhead associated with the new QTimer::singleShot syntax (compared with the old syntax), my application didn't render the end of some runs. I now "properly" handle multiple runs and everything works as expected (see here for those who had a look at my code before).

        So, thanks all for your feedback, it was much appreciated. (Thanks @VRonin for your std::bind() suggestion, which I now use.)

        aha_1980A Offline
        aha_1980A Offline
        aha_1980
        Lifetime Qt Champion
        wrote on last edited by
        #27

        @agarny said in QTimer::singleShot()'s syntax:

        Now, I know it's not great, but that's the compromise I had to make for my code to be as fast as possible, something that is important for my application.

        Are you really going to say that fast code must be buggy?

        Good luck with newer versions of your project. It may work more or less now, but when you add functionality sooner or later all uncleanliness hits back.

        Qt has to stay free or it will die.

        A 1 Reply Last reply
        3
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #28

          Mathematical model + race condition = quantum model I guess 🙂

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          5
          • aha_1980A aha_1980

            @agarny said in QTimer::singleShot()'s syntax:

            Now, I know it's not great, but that's the compromise I had to make for my code to be as fast as possible, something that is important for my application.

            Are you really going to say that fast code must be buggy?

            Good luck with newer versions of your project. It may work more or less now, but when you add functionality sooner or later all uncleanliness hits back.

            A Offline
            A Offline
            agarny
            wrote on last edited by
            #29

            @aha_1980 said in QTimer::singleShot()'s syntax:

            @agarny said in QTimer::singleShot()'s syntax:

            Now, I know it's not great, but that's the compromise I had to make for my code to be as fast as possible, something that is important for my application.

            Are you really going to say that fast code must be buggy?

            No, this is not what I am going to say otherwise I would have already said it.

            I merely said that to get the speed I was after I felt the need to make some compromises and that I am aware of their limitations, hence I have done my best to ensure that my code doesn't result in a race condition, etc. Should I ever find a solution that is "cleaner" and as fast as my current solution, then I will clearly implement it.

            (Thanks for the sarcasm.)

            kshegunovK 1 Reply Last reply
            0
            • A agarny

              @aha_1980 said in QTimer::singleShot()'s syntax:

              @agarny said in QTimer::singleShot()'s syntax:

              Now, I know it's not great, but that's the compromise I had to make for my code to be as fast as possible, something that is important for my application.

              Are you really going to say that fast code must be buggy?

              No, this is not what I am going to say otherwise I would have already said it.

              I merely said that to get the speed I was after I felt the need to make some compromises and that I am aware of their limitations, hence I have done my best to ensure that my code doesn't result in a race condition, etc. Should I ever find a solution that is "cleaner" and as fast as my current solution, then I will clearly implement it.

              (Thanks for the sarcasm.)

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

              @aha_1980's point is that you're building a house of cards here. Even if you don't see the effects now it is going to bite you in the a$$ sometime along the road. Remember what I wrote before: "If it works, it's the hand of god", well that's what he and I both mean. It's your code in the end and you can conduct your business as you like, we just felt it's a rather weak argument to ignore the simmering reality because you couldn't get enough speed at the time. In the end the speed would not matter if you don't get correct results, would it?

              Read and abide by the Qt Code of Conduct

              A 1 Reply Last reply
              3
              • kshegunovK kshegunov

                @aha_1980's point is that you're building a house of cards here. Even if you don't see the effects now it is going to bite you in the a$$ sometime along the road. Remember what I wrote before: "If it works, it's the hand of god", well that's what he and I both mean. It's your code in the end and you can conduct your business as you like, we just felt it's a rather weak argument to ignore the simmering reality because you couldn't get enough speed at the time. In the end the speed would not matter if you don't get correct results, would it?

                A Offline
                A Offline
                agarny
                wrote on last edited by agarny
                #31

                @kshegunov: I do hear what you are both saying, believe it or not (see above my comment about ever finding a "cleaner" solution).

                J 1 Reply Last reply
                0
                • A agarny

                  @kshegunov: I do hear what you are both saying, believe it or not (see above my comment about ever finding a "cleaner" solution).

                  J Offline
                  J Offline
                  Joe von Habsburg
                  wrote on last edited by Joe von Habsburg
                  #32

                  @agarny @JonB @aha_1980 @J-Hilk @JKSH @kshegunov @mrjj @VRonin

                  I would like to add condition to singleshot like that

                  bool youCanRun = true;
                  
                  timer.singleShot(1000, this, &MyClass::mySlot, youCanRun );
                  
                  // if youCanRun == true => singleshot will work
                  // else singleshot won't work
                  
                  

                  Note : "youCanRun" could be changed in singleshot waiting time

                  Is there any syntax or methot I could use?

                  JKSHJ 1 Reply Last reply
                  0
                  • J Joe von Habsburg

                    @agarny @JonB @aha_1980 @J-Hilk @JKSH @kshegunov @mrjj @VRonin

                    I would like to add condition to singleshot like that

                    bool youCanRun = true;
                    
                    timer.singleShot(1000, this, &MyClass::mySlot, youCanRun );
                    
                    // if youCanRun == true => singleshot will work
                    // else singleshot won't work
                    
                    

                    Note : "youCanRun" could be changed in singleshot waiting time

                    Is there any syntax or methot I could use?

                    JKSHJ Offline
                    JKSHJ Offline
                    JKSH
                    Moderators
                    wrote on last edited by
                    #33

                    @Joe-von-Habsburg said in QTimer::singleShot()'s syntax:

                    @agarny @JonB @aha_1980 @J-Hilk @JKSH @kshegunov @mrjj @VRonin

                    I would like to add condition to singleshot like that

                    bool youCanRun = true;
                    
                    timer.singleShot(1000, this, &MyClass::mySlot, youCanRun );
                    
                    // if youCanRun == true => singleshot will work
                    // else singleshot won't work
                    
                    

                    Note : "youCanRun" could be changed in singleshot waiting time

                    Is there any syntax or methot I could use?

                    Use a lambda. Check the value of youCanRun and call your slot if it is true.

                    bool youCanRun = true; // NOTE: This variable must not go out-of-scope before the timer is triggered
                    
                    QTimer::singleShot(1000, this, [&]{
                        if (youCanRun)
                            this->mySlot();
                        else
                            qDebug("You cannot run!");
                    });
                    

                    Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                    J 1 Reply Last reply
                    5
                    • JKSHJ JKSH

                      @Joe-von-Habsburg said in QTimer::singleShot()'s syntax:

                      @agarny @JonB @aha_1980 @J-Hilk @JKSH @kshegunov @mrjj @VRonin

                      I would like to add condition to singleshot like that

                      bool youCanRun = true;
                      
                      timer.singleShot(1000, this, &MyClass::mySlot, youCanRun );
                      
                      // if youCanRun == true => singleshot will work
                      // else singleshot won't work
                      
                      

                      Note : "youCanRun" could be changed in singleshot waiting time

                      Is there any syntax or methot I could use?

                      Use a lambda. Check the value of youCanRun and call your slot if it is true.

                      bool youCanRun = true; // NOTE: This variable must not go out-of-scope before the timer is triggered
                      
                      QTimer::singleShot(1000, this, [&]{
                          if (youCanRun)
                              this->mySlot();
                          else
                              qDebug("You cannot run!");
                      });
                      
                      J Offline
                      J Offline
                      Joe von Habsburg
                      wrote on last edited by
                      #34

                      @JKSH thank you :)

                      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