How to display the result of an operation in incremental fashion strating from 0?
-
@jsulm Yes, you are right. I am seeing only the end result after the loop exits.
I want to update the UI as it runs. The ui->product->display(product) displays the result in the UI.@Santhoshpl So try @LeLev's suggested code.
-
hi
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product= num1*num2;
int temp=0;
for(int i = 0; i<product; i++){
temp++;
ui->product->display(temp);you can use QTimer for that
double num1 = 10; double num2 = 2; double product = num1*num2; int currentDisplay=0; //< QTimer *timer = new QTimer(); QObject::connect(timer, &QTimer::timeout,[&](){ if(currentDisplay>=product){ timer->stop(); } qDebug()<<currentDisplay; // ui->product->display(temp); if(currentDisplay<product)currentDisplay++; }); timer->start(50);
@LeLev Thank you for the solution, but its crashing.
The error message displayed is:
The program has unexpectedly finished.
The process was ended forcefully.
productApplication.exe is crashed -
@LeLev Thank you for the solution, but its crashing.
The error message displayed is:
The program has unexpectedly finished.
The process was ended forcefully.
productApplication.exe is crashed@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:
crash
can you please show your code ?
-
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:
crash
can you please show your code ?
@LeLev please find the below code:
void MainWindow::on_controlButton_clicked()
{
double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product = num1 * num2;
double currentDisplay=0;
QTimer *timer = new QTimer();
QObject::connect(timer, &QTimer::timeout,&{
if(currentDisplay>=product){
timer->stop();
}
ui->product->display(currentDisplay);
QApplication::processEvents();
if(currentDisplay<meetingCost)currentDisplay++;
});
timer->start(500);
}
} -
@LeLev please find the below code:
void MainWindow::on_controlButton_clicked()
{
double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product = num1 * num2;
double currentDisplay=0;
QTimer *timer = new QTimer();
QObject::connect(timer, &QTimer::timeout,&{
if(currentDisplay>=product){
timer->stop();
}
ui->product->display(currentDisplay);
QApplication::processEvents();
if(currentDisplay<meetingCost)currentDisplay++;
});
timer->start(500);
}
}@Santhoshpl
It helps others if you put literal code in this forum's code markers.Meanwhile, I don't know, @Lelev writes
QObject::connect(timer, &QTimer::timeout,[&](){
while you write
QObject::connect(timer, &QTimer::timeout,&{
so do you know what you're doing there with your lambda? Is there any reason you change his code for this?
Otherwise run under debugger and look at the context/stack trace when the crash occurs.
-
@JonB said in How to display the result of an operation in incremental fashion strating from 0?:
[&]
Please take a c++ book about lambdas - you're passing by reference and it will therefore go out of scope...
-
@Gerd said in How to display the result of an operation in incremental fashion strating from 0?:
QApplication::processEvents();
This is an ugly work-around and should be avoided. It is better to program in asynchronous way instead of calling processEvents().
-
lol
then you should tell the qt people to remove such examples from the examples in qt sources...@Gerd said in How to display the result of an operation in incremental fashion strating from 0?:
then you should tell the qt people to remove such examples from the examples in qt sources...
you're right, it shouldn't be there, can you name/link such an example?
-
Qt\5.12.6.src\qtbase\examples\widgets\dialogs\findfiles
Qt\5.12.6.src\qtbase\examples\widgets\itemviews\pixelator
Qt\5.12.6.src\qtbase\examples\widgets\painting\fontsampler -
for these it isnt in the doc pages but in the sourcecode..
pixelator
fontsampler@Gerd
Well these examples haven't been touched in years, are very basic but never the less badly designed.One can redesign those examples, without the need for a processEvent calls, which will make them bigger (source code size).
But IMHO that's something that should be done. -
hi
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product= num1*num2;
int temp=0;
for(int i = 0; i<product; i++){
temp++;
ui->product->display(temp);you can use QTimer for that
double num1 = 10; double num2 = 2; double product = num1*num2; int currentDisplay=0; //< QTimer *timer = new QTimer(); QObject::connect(timer, &QTimer::timeout,[&](){ if(currentDisplay>=product){ timer->stop(); } qDebug()<<currentDisplay; // ui->product->display(temp); if(currentDisplay<product)currentDisplay++; }); timer->start(50);
@LeLev
I just read your response and it seemed what I need as well.
However, I just get a crash with this code:I have been having the same problems as the OP (and everyone else, I guess)
This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.void MainWindow::writeLeft() { int32_t cnt = 100; QString msg, cno; QTimer *ltimer = new QTimer(); do{ QTextStream(&cno) << cnt; msg = ("Hello left no : "+ cno); //message has been constructed, stop the process and display it QObject::connect(ltimer, &QTimer::timeout,[&](){ if(cnt > 0){ ltimer->stop(); } ui->memo1->appendPlainText(msg); }); cno.clear(); QThread::sleep(1); ltimer->start(10); cnt--; }while(cnt > 0); }
If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.
-
@LeLev
I just read your response and it seemed what I need as well.
However, I just get a crash with this code:I have been having the same problems as the OP (and everyone else, I guess)
This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.void MainWindow::writeLeft() { int32_t cnt = 100; QString msg, cno; QTimer *ltimer = new QTimer(); do{ QTextStream(&cno) << cnt; msg = ("Hello left no : "+ cno); //message has been constructed, stop the process and display it QObject::connect(ltimer, &QTimer::timeout,[&](){ if(cnt > 0){ ltimer->stop(); } ui->memo1->appendPlainText(msg); }); cno.clear(); QThread::sleep(1); ltimer->start(10); cnt--; }while(cnt > 0); }
If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.
-
@LeLev
I just read your response and it seemed what I need as well.
However, I just get a crash with this code:I have been having the same problems as the OP (and everyone else, I guess)
This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.void MainWindow::writeLeft() { int32_t cnt = 100; QString msg, cno; QTimer *ltimer = new QTimer(); do{ QTextStream(&cno) << cnt; msg = ("Hello left no : "+ cno); //message has been constructed, stop the process and display it QObject::connect(ltimer, &QTimer::timeout,[&](){ if(cnt > 0){ ltimer->stop(); } ui->memo1->appendPlainText(msg); }); cno.clear(); QThread::sleep(1); ltimer->start(10); cnt--; }while(cnt > 0); }
If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.
@Colins2 im not 100% sure what you need to do but see
int32_t cnt = 100; QString msg, cno; QTimer *ltimer = new QTimer(); //do{ // QTextStream(&cno) << cnt; //msg = ("Hello left no : "+ cno); QObject::connect(ltimer, &QTimer::timeout,[&](){ cnt--; if(cnt == 0){ // < ltimer->stop(); } qDebug()<< ("Hello left no : " + QString::number(cnt)); }); cno.clear(); // QThread::sleep(1); ltimer->start(10); // }while(cnt > 0);
-
@Colins2 im not 100% sure what you need to do but see
int32_t cnt = 100; QString msg, cno; QTimer *ltimer = new QTimer(); //do{ // QTextStream(&cno) << cnt; //msg = ("Hello left no : "+ cno); QObject::connect(ltimer, &QTimer::timeout,[&](){ cnt--; if(cnt == 0){ // < ltimer->stop(); } qDebug()<< ("Hello left no : " + QString::number(cnt)); }); cno.clear(); // QThread::sleep(1); ltimer->start(10); // }while(cnt > 0);
-