Re: [ROOT] Transient (Popup) Progress Meter

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Fri Oct 05 2001 - 12:20:20 MEST


Hi Glen,

  it is a timing problem due to the X server. The creation and popup generate
two sets of events in the X11 event queue. Use on ProcessEvents() to handle
those, then wait a short time and handle the second set of events. This second
set will show the "Initializing" string. See below for code that works for me:

Bool_t MainWindow::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
  TProgressMeter *meter = new
TProgressMeter(fClient->GetRoot(),fClient->GetRoot());
  meter->SetLabel("Initializing...");
  fClient->ProcessEventsFor(meter);
  gSystem->Sleep(40);                    // <-- add
  fClient->ProcessEventsFor(meter);      // <-- add
  gSystem->Sleep(2000);
  meter->SetLabel("Processing...");
  ...
}


Cheers, Fons.



"Glen R. Salo" wrote:
> 
> Hi Fons,
> 
> Thanks for your quick response.  The new method
> TGClient::ProcessEventsFor(TGWindow *w) works great with one exception as
> illustrated in the attached code.  Can you tell me why "Initializing..."
> does not appear in the popup window?
> 
> Thanks,
> 
> Glen
> 
> PS  I compiled the code using the command:
> 
> g++ -o progressmeter TProgressMeter.cxx `root-config --cflags`
> `root-config --glibs`
> 
> on a RedHat 7.1 Linux PC.
> 
> On 03-Oct-2001 Fons Rademakers wrote:
> > Hi Glen,
> >
> >   I've implemented a new method TGClient::ProcessEventFor(TGWindow *w)
> > that could be used instead of TSystem::ProcessEvents(). The code is in
> > CVS. Please try and let me know if it works for you.
> >
> > Cheers, Fons.
> >
> >
> >
> > "Glen R. Salo" wrote:
> >>
> >> Hi ROOTERS,
> >>
> >> I have a main GUI which enables the user to perform operations which
> >> can
> >> take several seconds to complete.  During these operations, I popup a
> >> transient progress meter indicating how long they have to wait.  In
> >> order
> >> to update the progress meter, I use gSystem->ProcessEvents() from a
> >> method
> >> inside the main GUI.  This works okay, but it has limitations --
> >> specifically, it enables events in the main GUI.  Is there a way I can
> >> avoid this problem?  The only solution I know is to create a separate
> >> class which includes both the time consuming method as well as the
> >> transient progress meter and then put the command
> >> fClient->WaitFor(this) in
> >> the transient progress meter class.  I believe this will work, but I
> >> would
> >> prefer a general purpose progress meter which I could use whenever
> >> there is
> >> a time consuming process being executed by my main GUI.  Does anyone
> >> have a
> >> suggestion?
> >>
> >> Thanks,
> >>
> >> Glen
> >
> > --
> > Org:    CERN, European Laboratory for Particle Physics.
> > Mail:   1211 Geneve 23, Switzerland
> > E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
> > WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480
> 
>   --------------------------------------------------------------------------------
>                             Name: TProgressMeter.cxx
>    TProgressMeter.cxx       Type: unspecified type (application/octet-stream)
>                         Encoding: base64
>                      Description: TProgressMeter.cxx

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:02 MET