File: Multi_thread_demo.py

package info (click to toggle)
python-traitsui 6.1.3-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 11,252 kB
  • sloc: python: 44,765; makefile: 117
file content (68 lines) | stat: -rw-r--r-- 1,887 bytes parent folder | download
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()