D
[david]
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()
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()