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 problemThanks 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 replaybut 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
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -
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. -
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.