Unsolved QSerialPort's read buffer is always empty while running another func.
-
In both your methods, your QProcess objects are local on the stack. They'll be destroyed at the end of the methods and will likely not have finished at that point.
Also, you argument list doesn't look right, you are trying to put everything on one line. You should put each element separately in the QStringList object.
-
@J-Hilk Yes. it gives the "Crashed" error and "Destroyed while process ("cmd.exe") is still running." What can I do to solve this?
@SGaist I know they are a local variable, I can't use a global variable. I tried to use a global variable instead of them, this time it never gave the finished event. I guess I didn't completely connect this signal. Also, this argument list is running like I want, if I write the waiting function... -
There's no need for global variables. Since you'll be using these commands several times, just keep them as member variables and setup them once in your dialog constructor.
Then you can re-use them as needed.
-
@Gokhan said in QSerialPort's read buffer is always empty while running another func.:
@J-Hilk Yes. it gives the "Crashed" error and "Destroyed while process ("cmd.exe") is still running." What can I do to solve this?
@SGaist I know they are a local variable, I can't use a global variable. I tried to use a global variable instead of them, this time it never gave the finished event. I guess I didn't completely connect this signal. Also, this argument list is running like I want, if I write the waiting function...Actually, that are to be expected error messages, for reasons, @SGaist explained!
QProgress does not have to be global to work e.g:
QString com=QString("/k img_cvt -i %1 -f 0").arg(img_down[idxProcess].image_with_ext); arguments <<com; QDir dir; dir.setCurrent("D:/conv"); QProcess *proc = new QProcess(); connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" << error; }); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishProcess(int, QProcess::ExitStatus)) ); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), proc, SLOT(deleteLater())); proc->start("cmd.exe",arguments);
-
@SGaist and @J-Hilk many thank your reply.
I'm using the proc variable as a member variable that is decelerated and initialized in class. "QProcess *proc = new QProcess();" like you said. However, it never gave the finish event. Why don't I get any event?
And when I re-click the button, it gives an error that is "QProcess::start: Process is already running",void image_down_dialog::on_convertButton_clicked() { idxProcess = 0; find_all_imgs(); QStringList arguments; QString com=QString("/k img_cvt -i %1 -f 0").arg(img_down[0].image_with_ext); arguments <<com; QDir::setCurrent("D:/User Interface/GUI_660_HMI/conv"); connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" << error; }); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishProcess(int, QProcess::ExitStatus)) ); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), proc, SLOT(deleteLater())); proc->start("cmd.exe",arguments); }
-
@Gokhan
ok first, if you make QProcess a member variable, move the connects into the constructor:QProcess *proc = new QProcess(); connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" << error; }); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
or you get problems when you press the button more than once.
also the deleteLater has to be moved to the destructor or you can use your QProcess object only once.
~MyClass(){ proc->deleteLater(); }
Why don't I get any event?
And when I re-click the button, it gives an error that is "QProcess::start: Process is already running",it would seem your process is still running right?
-
@J.Hilk said in QSerialPort's read buffer is always empty while running another func.:
also the deleteLater has to be moved to the destructor
If you pass the parent in the constructor there is no need to manually do this
-
-
@J-Hilk I did them you said, but the result is the same. It never gives the finished event, so it is always running.
-
-
@jsulm "/k img_cvt -i %1 -f 0" this is a one line command, so it has to write in one line. While I was also manually using this cmd application before, using it the same. Also, it successfully completes the conversion and creates a new folder within hex code. However, it never gives the finished information, it is continuous running to finish. I can see it's still running when re-click the button.
-
@Gokhan said in QSerialPort's read buffer is always empty while running another func.:
/k img_cvt -i %1 -f 0
Wrong it consists of several parameters: "/k" "img_cvt" "-i" "%1" "-f" "0"
-
That is a part of the user manual. I don't know how to use it like you said? However, it's normally running if use the waitforfinish function like I have mentioned above.
The usage is : img_cvt -i inputfilename -f format format is as follow: 0 : ARGB1555 [default] 1 : L1 2 : L4 3 : L8 4 : RGB332 5 : ARGB2 6 : ARGB4 7 : RGB565 8 : PALETTEED [FT80X only] 9 : L2 [FT81X only] Example : img_cvt -i lenaface40.png -f 8
-
@Gokhan
Just pass each parameter as one string in the string list (as shown here http://doc.qt.io/qt-5/qprocess.html):arguments <<"/k"<<"img_cvt"<<"-i"<<QString(%1).arg(img_down[0].image_with_ext)<<"-f"<<"0";
Also you should connect http://doc.qt.io/qt-5/qprocess.html#errorOccurred signal to a slot to check whether something went wrong.
-
@jsulm I just changed my code like you said and connected the signals that are like below in the constructor. The issue isn't solved. ErrorOccurred don't give an error while running.
proc = new QProcess (); connect(proc, & QProcess::errorOccurred, proc,[=](QProcess::ProcessError error){qDebug() <<"Process had an error:" << error; }); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishProcess(int, QProcess::ExitStatus)) );
-
@Gokhan Connect http://doc.qt.io/qt-5/qprocess.html#readyReadStandardError and http://doc.qt.io/qt-5/qprocess.html#readyReadStandardOutput to slots and print out what http://doc.qt.io/qt-5/qprocess.html#readAllStandardError and http://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput return. Maybe you will then see what is going on.
-
@jsulm There is no any readAllStandardError and you can see the output of readAllStandardOutput below. Everything shows normal.
readyReadStandardOutput "image conversion utility for FT8XX V0.7\r\nconvert complete!\r\n" readyReadStandardOutput "\r\nD:I\\conv>"
-
I'm trying that it, but I get an error that is "no matching function for call to 'image_down_dialog::connect(QProcess*&, <unresolved overloaded function type>, image_down_dialog*, void (image_down_dialog::*)(int, QProcess::ExitStatus))' " Why do I get this?
^
connect(proc, &QProcess::finished, this, &image_down_dialog::finishProcess); -
How did you declare
proc
? -
@Gokhan
Sadly, Signal finished is overloaded in this class. To connect to this one using the function pointer syntax, you must specify the signal type in a static cast:connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), [=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });