git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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!'
 |