Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to stop QFuture thread



  • Hello experts

    i was create a small threading application , in this application one function is run parallelly

    i am using QFuture and QConcurrent

    my problem in when i try to stop qfuture that time it can't be stop

    my code is :

                        void Mainwindow::Function_1()                        
                        {                        
                            for(int i=1 ; i <= 10 ;i++)                        
                            {                                        
                                QThread::sleep(1);                        
                                ui->label->setText(QString::number(i));                        
                            }                       
                        }
    
                       ////////////// Start ////////////
                       void Mainwindow::on_start_Button_clicked()                       
                       {                                 
                           future_1 = QtConcurrent::run(this,&Mainwindow::Function_1);                       
                       }
                      ////////////// Stop////////////
                      void Mainwindow::on_stop_Button_clicked()                      
                      {                                       
                          if(this->future_1.isRunning())                      
                          {                      
                              this->future_1.cancel();                      
                              this->future_1.setPaused(true);                                   
                          }                      
                      }
    

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    i read some documentation online but i can't get solution

    i am not able to stop qfuture thread between the running process
    please Help me to solve this problem

    Thanks in advance

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



  • QFurture cannot stop untill the fuction is completely executed...

    Be aware that not all running asynchronous computations can be canceled. For example, the future returned by QtConcurrent::run() cannot be canceled;

    QFuture::cancel() does not stop the thread immediately, it just cancels all the unstarted jobs.



  • @Bonnie
    thanks for the replay

    but any how i want to stop it

    is it have any other way to stop any process when it is running ?

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    please help me to solve the problem
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



  • @Ketan__Patel__0011

    You can considering doing the normal way to stop a loop in another thread: adding a member variable to control the loop.

    bool b_exitloop = false;
    
    for(int i=1 ; i <= 10 && !b_exitloop;i++)                        
    {
        QThread::sleep(1);
        ui->label->setText(QString::number(i));
    }  
    
    if(this->future_1.isRunning())
    {
      this->b_exitloop  = true;
      this->future_1.waitForFinished();
      this->b_exitloop = false;
    }
    

    But this cannot stop the sleep.
    Also be careful about synchronizing threads if you need to.



  • @Bonnie

    Thanks for reply

    i also try this way and i get good result

    but this is not a proper and good way for any large application and sensitive application

    i need a proper way to solve this problem

    i am also doing research for this



  • @Ketan__Patel__0011 Well, another way is to not using loop in you function and not using run. Try using those map functions in QtConcurrent.
    Then you can cancel it.



  • @Bonnie
    thanks for reply

    without looping statements is not reliable to manage lot's of process
    sorry but i can't remove looping statements



  • Then I think QtConcurrent is not the right solution for you when you need to exit a loop.
    The only way to exit a loop is still controlling by a variable.



  • @Bonnie

    Let's suppose if i use variable for controlling then when i false the any variable or boolean flag that time
    is memory still consuming or not ?



  • What memory do you mean?



  • @Bonnie

    if i stop the any function process using any boolean flag

    that time is memory(RAM) are still consuming or not ?

    and CPU are still used ?



  • If you exit the loop, the code in the loop will stop being executed.
    I don't understand what memeory / CPU are you talking about.


Log in to reply