[wxPython] CPU Utilisation

I have a simple program running under Win2k, Python 2.2, very recent (2.3.1?) wxPython.

The program puts a splitter window in a panel, and populates it with a scroling window plus another splitter window, in turn populated with a scrolling window and a wxGrid. When I run it, the CPU jumps straight up to the 100% mark and stays there.

Replacing the wxGrid with a simple scroling window doesn’t change anything, so I’d like to know what I’m doing wrong. Some of the code was written by Boa Constructor, but it looks reasonable to me (albeit too voluminous to post here). Anybody come across this?

still-trying-to-put-graphics-in-column-headers-ly y’rs - steve

···

Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/

The program puts a splitter window in a panel, and populates
it with a scroling window plus another splitter window, in
turn populated with a scrolling window and a wxGrid. When I
run it, the CPU jumps straight up to the 100% mark and stays
there.

Do you handle any paint events? On MSW if you don't create a wxPaintDC in a
EVT_PAINT handler then it can behave this way.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

No, there's no EVT_PAINT handling in the program. I'll see if that changes
anything...

regards
Steve

···

--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

----- Original Message -----
From: "Robin Dunn" <robin@alldunn.com>
To: <wxpython-users@lists.wxwindows.org>
Sent: Monday, May 13, 2002 2:58 PM
Subject: Re: [wxPython] CPU Utilisation

> The program puts a splitter window in a panel, and populates
> it with a scroling window plus another splitter window, in
> turn populated with a scrolling window and a wxGrid. When I
> run it, the CPU jumps straight up to the 100% mark and stays
> there.

Do you handle any paint events? On MSW if you don't create a wxPaintDC in

a

EVT_PAINT handler then it can behave this way.

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

_______________________________________________
wxpython-users mailing list
wxpython-users@lists.wxwindows.org
http://lists.wxwindows.org/mailman/listinfo/wxpython-users

Well, I've verified that it's a stream of EVT_PAINT events that are causing
the high utilisation (I just registered an event handler that printed a
message). However, I'm not sure what the protocol for switching the events
off might be - when EVT_PAINT calls the event's .Skip() method the CPU hits
the stop at 100%, but I only see two EVT_PAINT events. When I *don't* call
it I see a continuous stream of EVT_PAINT events and the window doesn't even
get completely drawn.

Clearly some fairly fundamental misunderstanding on my part, sorry.

regards
Steve

···

--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

----- Original Message -----
From: "Robin Dunn" <robin@alldunn.com>
To: <wxpython-users@lists.wxwindows.org>
Sent: Monday, May 13, 2002 2:58 PM
Subject: Re: [wxPython] CPU Utilisation

> The program puts a splitter window in a panel, and populates
> it with a scroling window plus another splitter window, in
> turn populated with a scrolling window and a wxGrid. When I
> run it, the CPU jumps straight up to the 100% mark and stays
> there.

Do you handle any paint events? On MSW if you don't create a wxPaintDC in

a

EVT_PAINT handler then it can behave this way.

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

_______________________________________________
wxpython-users mailing list
wxpython-users@lists.wxwindows.org
http://lists.wxwindows.org/mailman/listinfo/wxpython-users

Well, I've verified that it's a stream of EVT_PAINT events that are

causing

the high utilisation (I just registered an event handler that printed a
message). However, I'm not sure what the protocol for switching the events
off might be - when EVT_PAINT calls the event's .Skip() method the CPU

hits

the stop at 100%, but I only see two EVT_PAINT events. When I *don't* call
it I see a continuous stream of EVT_PAINT events and the window doesn't

even

get completely drawn.

Calling evt.Skip() allows the default handler to run, which does create the
wxPaintDC, so the problem doesn't happen.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

[Steve]

> Well, I've verified that it's a stream of EVT_PAINT events that are
causing
> the high utilisation (I just registered an event handler that printed a
> message). However, I'm not sure what the protocol for switching the

events

> off might be - when EVT_PAINT calls the event's .Skip() method the CPU
hits
> the stop at 100%, but I only see two EVT_PAINT events. When I *don't*

call

> it I see a continuous stream of EVT_PAINT events and the window doesn't
even
> get completely drawn.

[Robin]

Calling evt.Skip() allows the default handler to run, which does create

the

wxPaintDC, so the problem doesn't happen.

Well, this is the smallest program I've been able to build to show the
problem. Running it with 2.3.3pre2 pegs the CPU at 100%, but if I run it and
click the button I only see two EVT_PAINTs. Without the evt.Skip() call the
CPU still pegs, but I see a continuous stream of EVT_PAINTs and the window
doesn't complete its drawing. Am I doing something wrong? Would moving to
2.3.3pre3 help?

···

#----------------------------------------------------------------------
# A very simple wxPython example. Just a wxFrame, wxPanel,
# wxStaticText, wxButton, and a wxBoxSizer, but it shows the basic
# structure of any wxPython application.
#----------------------------------------------------------------------

from wxPython.wx import *
import sys

class MyFrame(wxFrame):
    """
    This is MyFrame. It just shows a few controls on a wxPanel,
    and has a simple menu.
    """
    def __init__(self, parent, title):
        wxFrame.__init__(self, parent, -1, title, size=(350, 200))

        menuBar = wxMenuBar()
        menu = wxMenu()
        menu.Append(101, "E&xit\tAlt-X", "Exit demo")
        EVT_MENU(self, 101, self.OnButton)
        menuBar.Append(menu, "&File")
        self.SetMenuBar(menuBar)

        panel = wxPanel(self, -1)
        if wxPlatform == "__WXMAC__":
            text = wxStaticText(panel, -1,
                                "Hello World!\nWhere is my menu?")
        else:
            text = wxStaticText(panel, -1, "Hello World!")
        text.SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD))
        text.SetSize(text.GetBestSize())
        btn = wxButton(panel, -1, "Close")
        btn.SetDefault()

        sizer = wxBoxSizer(wxVERTICAL)
        sizer.Add(text, 0, wxALL, 10)
        sizer.Add(btn, 0, wxALL, 10)
        panel.SetSizer(sizer)
        panel.SetAutoLayout(true)
        panel.Layout()
        EVT_BUTTON(self, btn.GetId(), self.OnButton)
        EVT_PAINT(self, self.doNothing)

    def doNothing(self, evt):
        print "Paint called"
        sys.stdout.flush()
        evt.Skip()

    def OnButton(self, evt):
        """Event handler for the button click."""
        print "OnButton"
        self.Close()

app = wxPySimpleApp()
frame = MyFrame(None, "Simple wxPython App")
frame.Show(true)
app.MainLoop()

regards
Steve
--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

Well, this is the smallest program I've been able to build to show the
problem. Running it with 2.3.3pre2 pegs the CPU at 100%, but if I run it

and

click the button I only see two EVT_PAINTs.

Were you expecting more? The EVT_PAINT event is only sent when the window
needs to be redrawn, (because it was uncovered, resized, somebody called
Refresh, etc.)

Without the evt.Skip() call the
CPU still pegs, but I see a continuous stream of EVT_PAINTs and the window
doesn't complete its drawing.

If you catch EVT_PAINT you are expected to create a wxPaintDC and draw on
it. If you call Skip then that lets the default handler run wich will
create a wxPaintDC and do its thing.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

> Well, this is the smallest program I've been able to build to show the
> problem. Running it with 2.3.3pre2 pegs the CPU at 100%, but if I run it
and
> click the button I only see two EVT_PAINTs.

Were you expecting more? The EVT_PAINT event is only sent when the window
needs to be redrawn, (because it was uncovered, resized, somebody called
Refresh, etc.)

No, that's fine. I'm just not clear why the CPU goes up to 100%. But I
understood you to say that evt.Skip() (causing the default event handler to
be activated) would resolve this problem. In fact it seems (?) that I see
the same behavior as when I simply don't *catch* the EVT_PAINT. This makes
sense in event terms, but I'm still at a loss to explain the high CPU usage.

> Without the evt.Skip() call the
> CPU still pegs, but I see a continuous stream of EVT_PAINTs and the

window

> doesn't complete its drawing.

If you catch EVT_PAINT you are expected to create a wxPaintDC and draw on
it. If you call Skip then that lets the default handler run wich will
create a wxPaintDC and do its thing.

That makes sense. Sorry if I haven't expressed myself well about this
problem. The only issue I really need to address is not using all the CPU to
do nothing in a GUI! :slight_smile:

regards
Steve

···

----- Original Message -----
From: "Robin Dunn" <robin@alldunn.com>
To: <wxpython-users@lists.wxwindows.org>
Sent: Monday, May 13, 2002 9:43 PM
Subject: Re: [wxPython] CPU Utilisation

--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

Problem solved, and not a wxPython error. Sorry about this.

When I finally tracked the CPU time to processes it turned out to be the
editor from which the program was started that was gobbling up the CPU time.

Many thanks for your attention to this matter. Also for Xitami, another
brilliantly-executed piece of software that deserves more popularity.

regards
Steve

···

--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

----- Original Message -----
From: "Steve Holden" <sholden@holdenweb.com>
To: <wxpython-users@lists.wxwindows.org>
Sent: Monday, May 13, 2002 10:32 PM
Subject: Re: [wxPython] CPU Utilisation

----- Original Message -----
From: "Robin Dunn" <robin@alldunn.com>
To: <wxpython-users@lists.wxwindows.org>
Sent: Monday, May 13, 2002 9:43 PM
Subject: Re: [wxPython] CPU Utilisation

> > Well, this is the smallest program I've been able to build to show the
> > problem. Running it with 2.3.3pre2 pegs the CPU at 100%, but if I run

it

> and
> > click the button I only see two EVT_PAINTs.
>
> Were you expecting more? The EVT_PAINT event is only sent when the

window

> needs to be redrawn, (because it was uncovered, resized, somebody called
> Refresh, etc.)
>
No, that's fine. I'm just not clear why the CPU goes up to 100%. But I
understood you to say that evt.Skip() (causing the default event handler

to

be activated) would resolve this problem. In fact it seems (?) that I see
the same behavior as when I simply don't *catch* the EVT_PAINT. This makes
sense in event terms, but I'm still at a loss to explain the high CPU

usage.

> > Without the evt.Skip() call the
> > CPU still pegs, but I see a continuous stream of EVT_PAINTs and the
window
> > doesn't complete its drawing.
>
> If you catch EVT_PAINT you are expected to create a wxPaintDC and draw

on

> it. If you call Skip then that lets the default handler run wich will
> create a wxPaintDC and do its thing.
>
That makes sense. Sorry if I haven't expressed myself well about this
problem. The only issue I really need to address is not using all the CPU

to

do nothing in a GUI! :slight_smile:

regards
Steve
--
-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

-----------------------------------------------------------------------
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/pwp/
-----------------------------------------------------------------------

_______________________________________________
wxpython-users mailing list
wxpython-users@lists.wxwindows.org
http://lists.wxwindows.org/mailman/listinfo/wxpython-users