Hello Axel, Rooters!
My idea at the moment is to implement an option for my program which determines whether to start it as an TRint (interactive) or just as a simple TApplication. In the first case I have my command line user interface, the second is for the special case described below.
The small example below does the job, the price is that I have to trigger the execution of the macro files manually. But this seems to solve my problem, so I pay it willingly :)
main.cxx:
#include "TSystem.h"
#include "Riostream.h"
#include "TMacro.h"
#include "TApplication.h"
#include "TRint.h"
#include "TObjArray.h"
#include "TObjString.h"
Int_t main( Int_t Argc, Char_t** Argv ) {
Bool_t Interactive=kTRUE;
for( Int_t i=0; i<Argc; ++i ) {
cout << "Arg[" << i << "]: " << Argv[i] << endl; if( !strcmp(Argv[i], "-noninteractive") ) Interactive=kFALSE;}
TApplication* theApp;
if( Interactive ) {
cout << "--- interactive mode ---" << endl; theApp = new TRint( "App", &Argc, Argv ); } else { cout << "--- non interactive mode ---" << endl; theApp = new TApplication( "App", &Argc, Argv );}
cout << "Running..." << endl;
if( Interactive ) {
theApp->Run( kTRUE );
} else {
cout << "Processing input files..." << endl; TIter Next( theApp->InputFiles() ); TObjString* ObjStr; while( (ObjStr = (TObjString*) Next()) ) { theApp->ProcessLine( Form( ".x %s", ObjStr->String().Data() ) ); }
Test.C
{
#include "Riostream.h"
cout<< "Hello World" << endl;
}
One thing that still puzzels me is: if background processes cannot write to the TTY, why do I see the ROOT Logo when doing this:
]> root -b &
The output stops when the ROOT prompt would be displayed. Guess I have to update my understanding of "tty" and "standard output". Until now this was identical for me...
Thanks for the help so far!
Thomas
Axel Naumann wrote:
> background processes cannot write to the TTY. If you have an idea (or a > patch! :-) how to get it to work nevertheless then please let us know. > > Cheers, Axel. > > Thomas Lauf wrote on 07/05/2010 04:59 PM: >> Hello ROOTers, >> >> is there a way to process a ROOT macro in the background? >> >> Consider this simple macro Test.C: >> { >> cout << "Hello World" << endl; >> } >> >> If I call ROOT to process it >> ]> root -q -l Test.C >> >> in the shell I get the expected output: >> >> root [0] >> Processing Test.C... >> Hello World >> ]> >> >> But if I want ROOT to process it in the background >> I get no output until I fetch the process to foreground again >> ]> root -q -l Test.C & >> [4] 16584 >> ]> fg >> root -q -l Test.C >> root [0] >> Processing Test.C... >> Hello World >> ]> >> >> Is there a way to make this work? >> >> The thing is I have a application (e.g. Prog1) which calls another one >> (e.g. Prog2) to do some calculation. Prog2 uses Rint as user interface. >> The call from Prog1 succeeds as long as it is run in foreground. If run >> in the background I run into the same problem as shown above. >> >> Regards >> >> Thomas LaufReceived on Tue Jul 06 2010 - 10:53:58 CEST
This archive was generated by hypermail 2.2.0 : Tue Jul 06 2010 - 11:50:01 CEST