Ticket #5067: workui.py

File workui.py, 1.6 KB (added by thomasvs, 11 years ago)
Line 
1# -*- Mode: Python -*-
2# vi:si:et:sw=4:sts=4:ts=4
3
4import sys
5
6from twisted.internet import gtk2reactor
7gtk2reactor.install()
8from twisted.internet import reactor
9
10import time
11import gtk
12
13
14def get(i):
15    print 'get', i
16    # the task that does the work
17    time.sleep(0.01)
18    return i
19
20def update(l, i):
21    print 'update', i
22    # the call that updates the UI
23    l.set_text(str(i))
24    time.sleep(0.01)
25
26
27def blocking(l):
28    for i in range(0, 1000):
29        get(i)
30        update(l, i)
31
32def calllater(l):
33    def later(l, i):
34        get(i)
35        update(l, i)
36
37    for i in range(0, 1000):
38        # 0.01 will definitely block the UI
39        # 0.02 does too
40        # 0.03 seems fine
41        reactor.callLater(.025 * i, later, l, i)
42
43def cooperator(l):
44    def myiter(numbers):
45        for n in numbers:
46            get(n)
47            update(l, n)
48            yield None
49
50    from twisted.internet import task
51    c = task.Cooperator()
52    c.cooperate(myiter(range(0, 1000)))
53
54strategies = [
55    "blocking",
56    "calllater",
57    "cooperator",
58]
59
60def main():
61
62    w = gtk.Window()
63    w.connect('destroy', lambda _: reactor.stop())
64    w.set_default_size(320, 240)
65
66    l = gtk.Label('start')
67
68    w.add(l)
69
70    w.show_all()
71
72
73
74    try:
75        strategy = sys.argv[1]
76    except IndexError:
77        strategy = 'cooperator'
78
79    if not strategy in strategies:
80        sys.stderr.write(
81            'Please give a strategy from: %s\n' % ", ".join(strategies))
82        sys.exit(1)
83
84    reactor.callLater(1, globals()[strategy], l)
85
86    reactor.run()
87
88if __name__ == '__main__':
89    main()