X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca298c88524c5c44c38d71af0c1f8ab81543e6a9..cf694132f1c28509a9f84377ce8d374bae4177ad:/utils/wxPython/tests/test8.py?ds=inline diff --git a/utils/wxPython/tests/test8.py b/utils/wxPython/tests/test8.py new file mode 100644 index 0000000000..ec383b7a09 --- /dev/null +++ b/utils/wxPython/tests/test8.py @@ -0,0 +1,85 @@ +# Thread testing example. Harm van der Heijden, March 26 1999. +# +# Rule One in threading: make sure only one thread interacts with the +# user interface. See the wxTextCtrlQueue class for an example of how +# to accomplish this + +import thread +import time +from whrandom import random + +from wxPython.wx import * + +# Set this to zero to prevent entering the wxApp mainloop +# (for testing whether threads work at all in the absense of wxWindows) +use_wxpython = 1 + +# write a message to stdout every second +def DoThread(mesg): + while 1: + sleeptime = (random() * 3) + 0.5 + print "Hello from %s (%1.3f)" % (mesg, sleeptime) + time.sleep(sleeptime) + +# the same, but write it to a textctrl. +def DoTextCtrlThread(text, mesg): + while 1: + sleeptime = (random() * 3) + 0.5 + text.WriteText("Hello from %s (%1.3f)\n" % (mesg, sleeptime)) + time.sleep(sleeptime) + +# A very simple queue for textctrls. +# Nice demonstration of the power of OO programming too (at least I think so!) +# WriteText puts text in the queue, rather than writing it immediately. +# The main (UI) thread must call Flush to force output. (see MyFrame::OnIdle) +class wxTextCtrlQueue(wxTextCtrl): + def __init__(self, parent, id, value, pos, size, flags): + wxTextCtrl.__init__(self,parent, id, value, pos, size, flags) + self.queue = [] + def WriteText(self, value): + self.queue.append(value) + def Flush(self): + queue = self.queue + self.queue = [] + for value in queue: + wxTextCtrl.WriteText(self,value) + +# MyFrame and MyApp are very simple classes to test python threads in +# wxPython. +class MyFrame(wxFrame): + def __init__(self): + wxFrame.__init__(self, NULL, -1, "test threads", wxDefaultPosition, wxSize(300,200)) + self.text = wxTextCtrlQueue(self, -1, "thread output\n", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE) + menu = wxMenu() + menu.Append(1001, "Start thread") + self.cnt = 0; + menubar = wxMenuBar() + menubar.Append(menu, "Action") + self.SetMenuBar(menubar) + EVT_MENU(self, 1001, self.StartThread) + def StartThread(self, event): + self.cnt = self.cnt + 1 + thread.start_new_thread(DoTextCtrlThread, (self.text, "thread %d" % self.cnt)) + def OnIdle(self, event): + self.text.Flush() + +class MyApp(wxApp): + def OnInit(self): + frame = MyFrame() + self.SetTopWindow(frame) + frame.Show(TRUE) + return TRUE + +# Start two threads that print a message every second +thread.start_new_thread(DoThread, ("thread A",)) +thread.start_new_thread(DoThread, ("thread B",)) + +# if using wxpython, open a frame. Otherwise, just hang in while 1 +if use_wxpython: + app = MyApp(0) + app.MainLoop() +else: + while 1: + print "main loop" + time.sleep(4) +print 'done!'