wxpython thread exception crash
david
david at nospam.spam
Mon Aug 27 00:38:55 EDT 2007
class RedirectText:
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
def write(self,string):
wx.CallAfter(self.out.WriteText,string) #CallAfter
def flush(self):
pass
[david]
[david] wrote:
> What am I doing wrong?
> I'm trying to capture stdErr in a multi-threaded program.
>
> This code crashes wxPython with
> /Py Assertion Error: C++ assertion "m_count=-1 || m_count=-2" failed/
>
> What I'm trying to do is redirect stderr and stdout to a wxPython text
> control.
> In an ideal world, when the worker thread crashes, I should get a stderr
> message, with no effect on the main thread.
>
> In an alternate world, I should get an asynchronous exception in the
> main thread when there is an unhandled exception in the worker thread.
>
> In the sample below, the program crashes on the following print statement.
>
> Oddly enough, I do catch the unhandled worker exception in the main
> thread IF THE WORKER THREAD HAS NO INIT PARAMETER. Note: the init
> parameter is the only subtle thing in the code.
>
> Since this is a crash, the exact behaviour will depend on your
> environment. You may have difficulty seeing stdErr in some environments.
>
> Python 2.5, wxPython 2.7.2.0, Windows XP.
> (david)
>
> --------
> import wx
> import sys
> import threading
>
> class ExceptionThread(threading.Thread):
> def __init__(self,initvar):
> threading.Thread.__init__(self);
>
> def run(self):
> raise "ET run"
>
>
> class RedirectText:
> def __init__(self,aWxTextCtrl):
> self.out=aWxTextCtrl
>
> def write(self,string):
> self.out.WriteText(string)
>
> def flush(self):
> pass
>
> class Frame(wx.Frame):
> def __init__(self, image=None, parent=None):
>
> wx.Frame.__init__(self, parent)
> self.text = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.TE_RICH2)
>
> #---- redirection window ----
> redir=RedirectText(self.text)
> sys.stdout=redir
> sys.stderr=redir
>
>
> class App(wx.App):
> def OnInit(self):
> self.frame=Frame()
> self.frame.Show()
> self.Thread=ExceptionThread(1)
> self.Thread.start();
> return True
>
>
> app = App()
> print 'trigger print failure'
> app.MainLoop()
>
>
More information about the Python-list
mailing list