On Wed, Feb 29, 2012 at 10:09 AM, Lata Agrawal <lata.agra...@enrouteinc.com> wrote: > Hi, > > I am running console application C1 in QProcess. I am starting this console > application C1 from another console application C2. Problem is: > I am only getting finished signal from C1 when I use waitforfinshed() else I > am not getting finished signal from C1. Here is the code:
Does your console app C1 quit after completing its work? Or is the event loop still running in C1?...have your called QApplication::quit/exit in C1 after it's done with it work? If not then C1 will continue to run untill explicitly exited (or killed from outside). > > QString strProgram; > strProgram = <Path to C1>; > > updateProc->setProcessChannelMode(QProcess::ForwardedChannels); > connect(updateProc, > SIGNAL(finished(int,QProcess::ExitStatus)), > SLOT(procStarted(int,QProcess::ExitStatus)), Qt::DirectConnection); 'procStarted' seems to be strange name for a slot handling the 'finished' singla!! :) > > updateProc->setStandardOutputProcess(this->thread()->parent()); > updateProc->start(strProgram, arguments); Why is this needed? Is C2 processing o/p of C1...or do you simply want to print stdout of C1 in C2's stdout (if so, then you've already done that by setting the channel mode above)? > > //Download is over, indicate through bool variable that next > downlaod can be started > if(updateProc->waitForFinished(-1)) > { > qDebug("Update process finished!\n"); > } > else > { > qDebug("Update process not yet finished!\n"); > } > > void FloDownloadManager::procStarted(int retVal ,QProcess::ExitStatus > exitStat) > { > qDebug("Update process finished automatically!\n"); > if(currentExecutingPriority == AdsUpdate) > { > emit adUpdateDone(); > } > blnStartNextUpdate = true; > > updateProc->deleteLater(); > } > > > If I comment the waitforfinished() code, I don't get the finished signal. > But if I include the waitforfinished() signal, I don't get the finished > signal. Code for C1 is as follows: > > #include <QtCore/QCoreApplication> > #include "updater.h" > > int main(int argc, char *argv[]) > { > QCoreApplication a(argc, argv); > > qDebug("Inside Updater\n"); > > QTimer::singleShot(5000, &a, SLOT(quit())); > qDebug("returning from Updater process!@@@@@@@@\n"); > > return 0; > } You have not started the apps event loop!!!...what do you expect it do? This program will exit out immediately! You need to do a.exec() for the timer signal to be processed. > > I read on other forums that if main process does not wait for child process > to finish like using waitforfinished, then finished signal will not be sent > to main process, rather child process after finishing will become defunct or > zombie. In my code above, if I use waitforfinished, then main process does > receive finished signal. AFAIK, in linux, if the parent process dies before a child process finishes, it is re-parented to init (process with pid 1). This is called an 'orphaned' process. Not to be confused with a zombie/defunct in which a process has exited, but it's entry has not been removed from process table. More: http://en.wikipedia.org/wiki/Orphan_process http://en.wikipedia.org/wiki/Zombie_process > > Is there any way by which main process can receive finished signal without > waiting for child process to finish? Yes, by connecting to the child QProcess's 'finished' signal. Thats what the signal is there for! :) It tells the parent when a process has exited and with what exit code. HTH, -mandeep > Regards, > Lata > > > -- > > > Lata Agrawal > Senior Developer > 9699750643 > En Route Media Pvt. Ltd. > > > > _______________________________________________ > Interest mailing list > Interest@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest > _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest