-
Notifications
You must be signed in to change notification settings - Fork 4
/
threads.py
101 lines (85 loc) · 2.87 KB
/
threads.py
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# PiTiVi , Non-linear video editor
#
# threads.py
#
# Copyright (c) 2005, Edward Hervey <[email protected]>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301, USA.
"""
Threading support
"""
import threading
from signallable import Signallable
from loggable import Loggable
#
# Following code was freely adapted by code from:
# John Stowers <[email protected]>
#
class Thread(threading.Thread, Signallable, Loggable):
"""
Event-powered thread
"""
__signals__ = {
"done": None}
def __init__(self):
threading.Thread.__init__(self)
Loggable.__init__(self)
def stop(self):
""" stop the thread, do not override """
self.abort()
self.emit("done")
def run(self):
""" thread processing """
self.process()
self.emit("done")
def process(self):
""" Implement this in subclasses """
raise NotImplementedError
def abort(self):
""" Abort the thread. Subclass have to implement this method ! """
pass
class ThreadMaster(Loggable):
"""
Controls all the threads existing in Pitivi.
"""
def __init__(self):
Loggable.__init__(self)
self.threads = []
def addThread(self, threadclass, *args):
""" Instantiate the specified Thread class and start it. """
assert issubclass(threadclass, Thread)
self.log("Adding thread of type %r", threadclass)
thread = threadclass(*args)
thread.connect("done", self._threadDoneCb)
self.threads.append(thread)
self.log("starting it...")
thread.start()
self.log("started !")
def _threadDoneCb(self, thread):
self.log("thread %r is done", thread)
self.threads.remove(thread)
def stopAllThreads(self):
""" Stop all running Thread(s) controlled by this master """
self.log("stopping all threads")
joinedthreads = 0
while(joinedthreads < len(self.threads)):
for thread in self.threads:
self.log("Trying to stop thread %r", thread)
try:
thread.join()
joinedthreads += 1
except:
self.warning("what happened ??")