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 68
|
"""
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 __future__ import absolute_import
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,
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()
|