loop for not waiting the end of process
-
Hello,
trying to convert some files with imagemagick, I did that:
QDir directory("//DGS1109N007/Echanges_SAA/Affichage/Messages"); QStringList images = directory.entryList(QStringList(),QDir::Files); for(int i=0;i<images.count();i++) { //do whatever you need to do QString filename=images[i]; qDebug()<<"filename"<<filename; program=QDir::toNativeSeparators("//DGS1109N007/Echanges_SAA/Affichage/Display/imagmagick/magick ")+ "convert -density 300 -trim "+ QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Messages/"+filename)+"\" -quality 100 "+QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Display/Messages/output.jpg"); myProcess.start(program); myProcess.waitForFinished(10000); }
the problem is the qdebug print all files but the process don't have time to restart between 2 files, using waitForFinished don't have any effect..
Any idea?
thanks a lot
-
@filipdns said in loop for not waiting the end of process:
the process don't have time to restart between 2 files, using waitForFinished don't have any effect..
Declare QProcess inside the loop, don't use a global instance. This is not what QProcess was designed to do.
Are you sure the process actually starts? Your paths look weird (what's that double slash at their beginning? Are you trying to run something from a network storage? That is likely to fail).
Please check return values and error outputs to see if QProcess actually starts.
-
@sierdzio Hi,
Yes the process is working, I seen the ouput file created without any problem and I don't have any error and yes the double slash is to point network exe but it's not that the problem.
I'm may be wrong but it's doing like in loop, the process is launch but the loop don't stop until the process is funished, the loop return immediately after launch it.
-
If the process works, and you see the output file being created, then I'd say there is no problem at all... it works. If you mean that next loop iteration overwrites your process or something, then do as I suggested and create new QProcess instance inside the loop.
PLease note that
waitForFinished
will wait at most the specified amount of time. If process ends sooner, it will stop waiting. So if your process finishes extremely fast, you may not even notice any delay.BTW. You probably should call waitForStarted() before calling waitForFinished().
-
@sierdzio it almost work, the problem is only one output file is created, but it suppose to have many one (images.count() return 5)
using .bat with
for %%f in ("\\DGS1109N007\Echanges_SAA\Affichage\Messages\*.*") do ( \\DGS1109N007\Echanges_SAA\Affichage\Display\imagmagick\magick convert -density 300 -trim "\\DGS1109N007\Echanges_SAA\Affichage\Messages\*.*" -quality 100 "\\DGS1109N007\Echanges_SAA\Affichage\Display\Messages\output.jpg" )
in the ouput folder I got all 5 files named output.jpg, output-0.jpg, output-1.jpg etc...
-
Hi,
You should try to properly build the argument list as a QStringList as show in QProcess' doc.
-
@filipdns I will try to change the process to . in place of file name, I will see if it work but I doubt because in the .bat, I have to have for %%f in to make it convert all files, that why I pass trough loop for or foreach but without success
-
here how was my first code
program=QDir::toNativeSeparators("//DGS1109N007/Echanges_SAA/Affichage/Display/imagmagick/magick.exe ") QStringList arguments; arguments<< "convert -density 300 -trim "<<QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Messages/")+filename<<" -quality 100 "<<QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Display/Messages/output.jpg"); myProcess.start(program,arguments);
-
@filipdns said in loop for not waiting the end of process:
arguments<< "convert -density 300 -trim "<<QDir::toNativeSeparators(""//DGS1109N007/Echanges_SAA/Affichage/Messages/")+filename<<" -quality 100 "<<QDir::toNativeSeparators(""//DGS1109N007/Echanges_SAA/Affichage/Display/Messages/output.jpg");
This is wrong. EVERY parameter needs to be an element in parameter list. Like:
arguments<< "convert" << "-density" << "300" << "-trim "<<QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Messages/")+filename << "-quality" << "100 "<<QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Display/Messages/output.jpg");
-
@jsulm Hello, I try that but it's not working.
I solve my issue with:
program=QDir::toNativeSeparators("//DGS1109N007/Echanges_SAA/Affichage/Display/imagmagick/magick ")+ "convert -density 300 -trim "+ QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Messages/"+filename)+"\" -quality 100 "+QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Display/Messages/"+outfilename+".jpg"); if(myProcess.state()!= QProcess::Running) { myProcess.start(program); myProcess.waitForFinished(5000); i=i+1; }
thank you very much for you help!!
-
@filipdns said in loop for not waiting the end of process:
i=i+1;
That means you are skipping one image for every loop iteration.
if(myProcess.state()!= QProcess::Running)
And that means you may skip many more if process is still running. You could have avoided that if you created local QProcess inside the loop...
-
@filipdns said in loop for not waiting the end of process:
@sierdzio hi, no it's not skipping any image
OK then you probably have removed
i++
from first line of your loop? Then that has another side effect - until your process exits you are forcing a tight, endless loop. That will eat your CPU, don't do it.Also, if QProcess gets stuck for any reason, that loop will never exit.
but what do you mean with process inside the loop?
for (whatever) { QProcess process; process.start(program); process.waitForStarted(5000); if(process.waitForFinished(5000) == false) qInfo() << "Process had some trouble" << process.errorString() << program; }
-
@filipdns said in loop for not waiting the end of process:
@sierdzio Yes I removed the I++ from first line. I didn't know that will have effect on my cup, I will change that and see if your advise can do the job, thanks a lot
You can check the endless loop easily. Print a message at the beginning of the loop:
for (...) { qDebug() << "Loop block begins"; }
If you see lots and lots of these lines (more than the number of images you have) then it's looping tightly as I mentioned in my last reply.
-
@sierdzio I try to move the i=i+1 to the i++ in the line for(int i=0;i<images.count();i++) and it's working fine only if I keep the waitForFinished(5000) otherwise, I have infinit loop
for(int i=0;i<images.count();i++) { //do whatever you need to do QString filename=images[i]; QString outfilename=filename.split(".")[0]; program2=QDir::toNativeSeparators("//DGS1109N007/Echanges_SAA/Affichage/Display/imagmagick/magick ")+ "convert -density 300 -trim "+ QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Messages/"+filename)+"\" -quality 100 "+QDir::toNativeSeparators("\"//DGS1109N007/Echanges_SAA/Affichage/Display/Messages/"+outfilename+".jpg"); if(myProcess2.state()!= QProcess::Running) { myProcess2.start(program2); myProcess2.waitForFinished(5000); //i=i+1; } }