1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
"""
Monitoring threads in the user interface
Shows a simple user interface being updated by multiple threads.
When the *Start Threads* button is pressed, the program starts three independent
threads running. Each thread counts from 0 to 199, updating its own
thread-specific trait, and performs a sleep of a thread-specific duration
between each update.
The *Start Threads* button is disabled while the threads are running, and
becomes active again once all threads have finished running.
"""
from threading import Thread
from time import sleep
from traits.api import HasTraits, Int, Button
from traitsui.api import View, Item, VGroup
class ThreadDemo(HasTraits):
# The thread specific counters:
thread_0 = Int
thread_1 = Int
thread_2 = Int
# The button used to start the threads running:
start = Button('Start Threads')
# The count of how many threads ae currently running:
running = Int
view = View(
VGroup(
Item('thread_0', style = 'readonly'),
Item('thread_1', style = 'readonly'),
Item('thread_2', style = 'readonly'),
),
'_',
Item('start', show_label = False,
width = -90,
enabled_when = 'running == 0' ),
resizable = True,
width = 250,
title = 'Monitoring threads'
)
def _start_changed(self):
for i in range(3):
Thread(target = self.counter,
args = ('thread_%d' % i, (i*10 + 10)/1000.0)).start()
def counter(self, name, interval):
self.running += 1
count = 0
for i in range( 200 ):
setattr(self, name, count)
count += 1
sleep(interval)
self.running -= 1
# Create the demo:
demo = ThreadDemo()
# Run the demo (if invoked from the command line):
if __name__ == '__main__':
demo.configure_traits()
|