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... -
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?
-
-
@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){ /* ... */ });
-
@J-Hilk It should be connected below to compile successfully, so it's static cast. I did it and it can compile and connect now without an issue. However, I haven't solved this problem yet, it isn't still giving the finished event. Can it be a bug with qprocess ? Should I write a bug report?
QObject::connect(proc, (void (QProcess::*)(int,QProcess::ExitStatus))&QProcess::finished, this, &image_down_dialog::finished);