Hello Rooters
I am trying to build a standalone C++ program (that is, that contains a “main”) wich compute some quantities and use ROOT graphics to display results as the computation goes.
Unfortunately, I cannot interact with ROOT Canvas while the main program is running. I have attached a small example to show the problem.
There is an example in ROOT ( root/test/threads.cxx ) using TThreads to solve this problem but I was wondering if there was not an easier way.
Thanks
main.cxx (2.19 KB)
Hi Matthieu,
Here is the easy way:
Just add gSystem->ProcessEvents() in your “while (!stop)” loop, or in the surfaces() function, i.e. after c1->Update();
Bertrand.
Hello Bertrand
I’ve tried what you said but it doesn’t work. Using “gsystem->ProcessEvents() ;” I have now, on the TCanvas, the menu bar but I still cannot interact with the Graph in the TCanvas (to rotate the graph for instance), neither can I close the TCanvas.
I have written a simpler example to show the problem.
I am using ROOT 5.17/04 compiled with gcc4.2.2 on a Debian Linux box and to compile this code in a file named “test.cxx” I am using the following command:
g++ root-config --libs
-Iroot-config --incdir
test.cxx -o test
#include <cstdlib>
#include <ctime>
#include "TSystem.h"
#include "TApplication.h"
#include "TCanvas.h"
#include "TF2.h"
int main( int argc , char* argv[] )
{
TApplication theApp("App", &argc, argv);
TCanvas c1("c1","Test",1);
TF2 f2("f2","x**2 + y**2 - x**3 -8*x*y**4",-1,1.2,-1.5,1.5);
f2.Draw("surf4");
c1.Update() ;
gSystem->ProcessEvents() ;
// loop for waiting 10 seconds
time_t t0 = time(0);
unsigned int wait = 10 ; // 10 seconds to wait
while( static_cast< unsigned int >(time(0) - t0) < wait);
theApp.Run() ;
return EXIT_SUCCESS;
}
The “while” loop is just here to simulate some computation. I can interact with the Canvas only after the 10 seconds, not during the while loop.
Any idea what is wrong?
Thanks
Hi Matthieu,
You must put gSystem->ProcessEvents() INSIDE your loop!
the goal of gSystem->ProcessEvents() is to allow you to interact with the GUI/graphics, then it MUST BE inside the loop.
Bertrand.