clofresh / emergent

A humble attempt at creating emergent behavior

Clone this repository (size: 55.2 KB): HTTPS / SSH
$ hg clone http://bitbucket.org/clofresh/emergent/
commit 12: 574d96c23100
parent 11: ff1803aafd49
branch: default
threaded paint step, removed old threading implementation
Carlo Cabanilla
20 months ago

Changed (Δ1.7 KB):

raw changeset »

emergent/common.py (0 lines added, 2 lines removed)

emergent/states.py (10 lines added, 73 lines removed)

Up to file-list emergent/common.py:

@@ -4,8 +4,6 @@ from random import randint
4
4
RESOLUTION = (640, 480)
5
5
FPS = 60
6
6
7
THREAD_LIMIT = 1
8
9
7
class SubclassShouldImplement(Exception):
10
8
    def __init__(self, msg="A method was called which should have been overridden"):
11
9
	Exception.__init__(self,msg)

Up to file-list emergent/states.py:

@@ -7,7 +7,7 @@ import pygame
7
7
from pygame.locals import *
8
8
9
9
import gui 
10
from common import SubclassShouldImplement, THREAD_LIMIT, FPS
10
from common import SubclassShouldImplement, FPS
11
11
 
12
12
class StateDriver:
13
13
    def __init__(self,screen):
@@ -103,8 +103,6 @@ class State(gui.Keyable,gui.Mouseable):
103
103
        pass
104
104
    
105
105
class GuiState(State):
106
    jobQueue = Queue()
107
108
106
    def __init__(self):
109
107
        State.__init__(self)
110
108
        self.paintables = []
@@ -151,78 +149,17 @@ class GuiState(State):
151
149
                
152
150
153
151
    def paint(self,screen):
154
        startTime = clock()
152
        threads = []
153
        for paintable in self.paintables:
154
            t = Thread(target=paintable.paint, args=[screen])
155
            t.start()
156
            threads.append(t)
155
157
156
        if THREAD_LIMIT == 1:
157
            for paintable in self.paintables:
158
                paintable.paint(screen)
159
#            print 'Painted %s' % len(self.paintables)
160
        else:
161
            for paintable in self.paintables:
162
                GuiState.jobQueue.put(paintable)
163
    
164
            paintingThreads = []
165
            for n in xrange(THREAD_LIMIT):
166
                pt = PaintingThread(screen)
167
                pt.start()
168
                paintingThreads.append(pt)
169
    
170
            
171
            for pt in paintingThreads:
172
                pt.join()
173
        
174
        endTime = clock()
175
        
176
#        print 'Painted in %s seconds' % (endTime - startTime)
177
        
178
        
179
            
158
        for t in threads:
159
            t.join()
180
160
181
161
    def update(self,delay):
182
        startTime = clock()
183
184
        if THREAD_LIMIT == 1:
185
            for updateable in self.updateables:
186
                updateable.update(delay)
187
#            print 'Updated %s' % len(self.updateables)
188
        else:
189
            for updateable in self.updateables:
190
                GuiState.jobQueue.put(updateable)
191
    
192
            updatingThreads = []
193
            for n in xrange(THREAD_LIMIT):
194
                ut = UpdatingThread(delay)
195
                ut.start()
196
                updatingThreads.append(ut)
197
    
198
            
199
            for ut in updatingThreads:
200
                ut.join()
201
202
        endTime = clock()
203
        
204
#        print 'Updated in %s seconds' % (endTime - startTime)
162
        for updateable in self.updateables:
163
            updateable.update(delay)
205
164
206
165
            
207
class PaintingThread(Thread):
208
    def __init__(self, screen):
209
        Thread.__init__(self)
210
        self.screen = screen
211
        
212
    def run(self):
213
        while GuiState.jobQueue.empty() == False:
214
            GuiState.jobQueue.get(False).paint(self.screen)
215
            
216
            
217
class UpdatingThread(Thread):
218
    def __init__(self, delay):
219
        Thread.__init__(self)
220
        self.delay = delay
221
        
222
    def run(self):
223
        try:
224
            while GuiState.jobQueue.empty() == False:
225
                GuiState.jobQueue.get(False).update(self.delay)
226
        except Empty:
227
            pass
228