QTimer make traitement out of for loop ?
-
Based on you other thread, I would say that you should refactor your payload processing logic.
Rather than I tight loop that you are going to block use for example invokeMethod when you are done with the processing of the current payload. That way, for that particular case, you will call invokeMethod as the last thing in you lambda to continue the processing. Your loop will otherwise continue.
-
That's one way of implementing it.
-
@SGaist is there a way more easy than that ? with another type of timer ?
can i use this signal void QTimer::timeout()? -
@imene C++ lambda functions: https://en.cppreference.com/w/cpp/language/lambda
-
QTimer::singleShot :This static function calls a slot after a given time interval; in my case i want the code to make the traitement inside QTimer::singleShot before it pass to make the next if condition .
@imene said in QTimer make traitement out of for loop ?:
to make the traitement inside QTimer::singleShot before it pass to make the next if condition .
Let the QTimer::singleShot() fire and check for your codition inside the slot.
-
@Christian-Ehrlicher how ?
-
@Christian-Ehrlicher how ?
@imene said in QTimer make traitement out of for loop ?:
how ?
if (yourCoditionIsMet) { doSomethingYouWant() }
maybe?
-
@Christian-Ehrlicher
my condition is to wait for QTimer::singleShot() to be executed -
@Christian-Ehrlicher
my condition is to wait for QTimer::singleShot() to be executed@imene said in QTimer make traitement out of for loop ?:
my condition is to wait for QTimer::singleShot() to be executed
Why?
If you want to stop a timer, use a QTimer object and stop it if you want. -
This timer
connect(m_speedTimer, &QTimer::timeout, this, &MainWindow::on_Send_Row_Button_clicked);
if( trameRecu[0]==trameTest[0]){ qDebug() <<"Test FF good!"; //model dialogue informing mModel->item(b, 4)->setText("FF");//ack m_speedTimer->start(8000); QTimer::singleShot(7000, [=](){ qDebug()<<"Timer on do something after 7000 msec..."; if((Send_Frame_Get_ACK_Function(SetPayloadRPM))=="FF") { qDebug() << "Send_Frame_Get_ACK_Function Pass" ; QString MySpeed=0; MySpeed = Send_Frame_Get_Speed_Function(NSetPayload); //SetPayloadMem="F504" qDebug() << " MySpeed" <<MySpeed; double MSpeed = MySpeed.toFloat(); qDebug() << " MSpeed" <<MSpeed; bool result = ((MSpeed >= 40) && (MSpeed <= 60)); qDebug() << "((MSpeed >= 40) && (MSpeed <= 60))" << result; result = ((MSpeed >= 90) && (MSpeed <= 110) ); qDebug() << "((MSpeed >= 90) && (MSpeed <= 110))" << result; result = ((MSpeed >= 490) && (MSpeed <= 520) ); qDebug() << "((MSpeed >= 490) && (MSpeed <= 520))" << result; if ((MSpeed > 40) && (MSpeed < 60) ) {mModel->item(b, 6)->setText("+50");}//result else if ((MSpeed > 90) && (MSpeed < 110)) {mModel->item(b, 6)->setText("+100");}//result else if ((MSpeed > 140) && (MSpeed < 160)) {mModel->item(b, 6)->setText("+150");}//result else if ((MSpeed > 190) && (MSpeed < 210)) {mModel->item(b, 6)->setText("+200");}//result else if ((MSpeed > 240) && (MSpeed < 260)) {mModel->item(b, 6)->setText("+100");}//result else if ((MSpeed > 290) && (MSpeed < 310)) {mModel->item(b, 6)->setText("+100");}//result else if ((MSpeed >490) && (MSpeed < 520)) {mModel->item(b, 6)->setText("+500");}//result else {mModel->item(b, 6)->setText("Error"); qDebug() << " MSpeed if" <<MSpeed;}//result } m_speedTimer->stop(); });//singleshot timer here }
m_speedTimer->start(8000);
repeat the traitement under it each 8000 but when i use m_speedTimer->stop(); it make traitement one time and stops without waiting 8000 msec!
I need a timer that make traitement after 8000msec. -
This timer
connect(m_speedTimer, &QTimer::timeout, this, &MainWindow::on_Send_Row_Button_clicked);
if( trameRecu[0]==trameTest[0]){ qDebug() <<"Test FF good!"; //model dialogue informing mModel->item(b, 4)->setText("FF");//ack m_speedTimer->start(8000); QTimer::singleShot(7000, [=](){ qDebug()<<"Timer on do something after 7000 msec..."; if((Send_Frame_Get_ACK_Function(SetPayloadRPM))=="FF") { qDebug() << "Send_Frame_Get_ACK_Function Pass" ; QString MySpeed=0; MySpeed = Send_Frame_Get_Speed_Function(NSetPayload); //SetPayloadMem="F504" qDebug() << " MySpeed" <<MySpeed; double MSpeed = MySpeed.toFloat(); qDebug() << " MSpeed" <<MSpeed; bool result = ((MSpeed >= 40) && (MSpeed <= 60)); qDebug() << "((MSpeed >= 40) && (MSpeed <= 60))" << result; result = ((MSpeed >= 90) && (MSpeed <= 110) ); qDebug() << "((MSpeed >= 90) && (MSpeed <= 110))" << result; result = ((MSpeed >= 490) && (MSpeed <= 520) ); qDebug() << "((MSpeed >= 490) && (MSpeed <= 520))" << result; if ((MSpeed > 40) && (MSpeed < 60) ) {mModel->item(b, 6)->setText("+50");}//result else if ((MSpeed > 90) && (MSpeed < 110)) {mModel->item(b, 6)->setText("+100");}//result else if ((MSpeed > 140) && (MSpeed < 160)) {mModel->item(b, 6)->setText("+150");}//result else if ((MSpeed > 190) && (MSpeed < 210)) {mModel->item(b, 6)->setText("+200");}//result else if ((MSpeed > 240) && (MSpeed < 260)) {mModel->item(b, 6)->setText("+100");}//result else if ((MSpeed > 290) && (MSpeed < 310)) {mModel->item(b, 6)->setText("+100");}//result else if ((MSpeed >490) && (MSpeed < 520)) {mModel->item(b, 6)->setText("+500");}//result else {mModel->item(b, 6)->setText("Error"); qDebug() << " MSpeed if" <<MSpeed;}//result } m_speedTimer->stop(); });//singleshot timer here }
m_speedTimer->start(8000);
repeat the traitement under it each 8000 but when i use m_speedTimer->stop(); it make traitement one time and stops without waiting 8000 msec!
I need a timer that make traitement after 8000msec.@imene said in QTimer make traitement out of for loop ?:
t make traitement one time and stops without waiting 8000 msec!
Then remember that you want to stop your timer after the next timeout and stop it then.
-
@imene said in QTimer make traitement out of for loop ?:
What does m_speedTimer->start(8000); and m_speedTimer->stop(); do exactely ?
Really??
-
I want a timer that stop reading the code for 7sec then complete and execute the function, because singleShot timer execute function after 7 sec here:
QTimer::singleShot(7000, [=](){ qDebug()<<"Timer on do something after 6 second..."; // i want to set a time out condition here });//timer ends here
-
I want a timer that stop reading the code for 7sec then complete and execute the function, because singleShot timer execute function after 7 sec here:
QTimer::singleShot(7000, [=](){ qDebug()<<"Timer on do something after 6 second..."; // i want to set a time out condition here });//timer ends here
@imene said in QTimer make traitement out of for loop ?:
qDebug()<<"Timer on do something after 6 second...";
QTimer::singleShot(7000, ={
Maybe you should at least add a correct comment...
We already told you how to start a timer, how to stop it and how you set a (member) variable to not execute something if this variable is set to a certain value is nothing we need to discuss here - it's a task for a c++ beginners book.
-
what i have to do ?
QObject::connect(m_speedTimer,&QTimer::timeout, this, &MainWindow::sendFrame,Qt::AutoConnection);
void MainWindow::sendFrame(QString IdData_R,QString PayloadData_R,int i) { if (m_canDevice) { m_speedTimer->start(6000); ... } }
void MainWindow::on_SendAll_Button_clicked() {int a= m_ui->Table_CSV->model()->rowCount(); for(int i=0;i<a; i++) //R :read , W :write { sendFrame(IdData_R, PayloadData_R,i);//}); } m_speedTimer->stop(); }
-
what i have to do ?
QObject::connect(m_speedTimer,&QTimer::timeout, this, &MainWindow::sendFrame,Qt::AutoConnection);
void MainWindow::sendFrame(QString IdData_R,QString PayloadData_R,int i) { if (m_canDevice) { m_speedTimer->start(6000); ... } }
void MainWindow::on_SendAll_Button_clicked() {int a= m_ui->Table_CSV->model()->rowCount(); for(int i=0;i<a; i++) //R :read , W :write { sendFrame(IdData_R, PayloadData_R,i);//}); } m_speedTimer->stop(); }