瀏覽代碼

added Job pstats, derive from DirectObject

Darren Ranalli 18 年之前
父節點
當前提交
e5fc82670d
共有 2 個文件被更改,包括 23 次插入1 次删除
  1. 11 1
      direct/src/showbase/Job.py
  2. 12 0
      direct/src/showbase/JobManager.py

+ 11 - 1
direct/src/showbase/Job.py

@@ -1,4 +1,9 @@
-class Job:
+from direct.showbase.DirectObject import DirectObject
+
+if __debug__:
+    from pandac.PandaModules import PStatCollector
+
+class Job(DirectObject):
     # Base class for cpu-intensive or non-time-critical operations that
     # Base class for cpu-intensive or non-time-critical operations that
     # are run through the JobManager.
     # are run through the JobManager.
 
 
@@ -15,12 +20,17 @@ class Job:
         self._generator = None
         self._generator = None
         self._id = Job._SerialGen.next()
         self._id = Job._SerialGen.next()
         self._printing = False
         self._printing = False
+        if __debug__:
+            self._pstats = PStatCollector("App:Show code:jobManager:%s" % self._name)
 
 
     def destroy(self):
     def destroy(self):
         del self._name
         del self._name
         del self._generator
         del self._generator
         del self._printing
         del self._printing
 
 
+    def getFinishedEvent(self):
+        return 'job-finished-%s' % self._id
+
     def run(self):
     def run(self):
         # this is a generator
         # this is a generator
         # override and do your processing
         # override and do your processing

+ 12 - 0
direct/src/showbase/JobManager.py

@@ -83,6 +83,8 @@ class JobManager:
         # grab the job
         # grab the job
         job = self._pri2jobId2job[pri][jobId]
         job = self._pri2jobId2job[pri][jobId]
         gen = job._getGenerator()
         gen = job._getGenerator()
+        if __debug__:
+            job._pstats.start()
         job.resume()
         job.resume()
         while True:
         while True:
             try:
             try:
@@ -96,8 +98,11 @@ class JobManager:
                 job.suspend()
                 job.suspend()
                 self.remove(job)
                 self.remove(job)
                 job.finished()
                 job.finished()
+                messenger.send(job.getFinishedEvent())
                 # job is done.
                 # job is done.
                 break
                 break
+        if __debug__:
+            job._pstats.stop()
 
 
     # how long should we run per frame?
     # how long should we run per frame?
     def getTimeslice(self):
     def getTimeslice(self):
@@ -125,6 +130,8 @@ class JobManager:
                 jobId = self._pri2jobIds[self._highestPriority][0]
                 jobId = self._pri2jobIds[self._highestPriority][0]
                 job = jobId2job[jobId]
                 job = jobId2job[jobId]
                 gen = job._getGenerator()
                 gen = job._getGenerator()
+                if __debug__:
+                    job._pstats.start()
                 job.resume()
                 job.resume()
                 while globalClock.getRealTime() < endT:
                 while globalClock.getRealTime() < endT:
                     try:
                     try:
@@ -138,6 +145,9 @@ class JobManager:
                         job.suspend()
                         job.suspend()
                         self.remove(job)
                         self.remove(job)
                         job.finished()
                         job.finished()
+                        if __debug__:
+                            job._pstats.stop()
+                        messenger.send(job.getFinishedEvent())
                         # highest-priority job is done.
                         # highest-priority job is done.
                         # grab the next one if there's time left
                         # grab the next one if there's time left
                         break
                         break
@@ -145,6 +155,8 @@ class JobManager:
                     # we've run out of time
                     # we've run out of time
                     #assert self.notify.debug('timeslice end: %s, %s' % (endT, globalClock.getRealTime()))
                     #assert self.notify.debug('timeslice end: %s, %s' % (endT, globalClock.getRealTime()))
                     job.suspend()
                     job.suspend()
+                    if __debug__:
+                        job._pstats.stop()
                     break
                     break
                 
                 
                 if len(self._pri2jobId2job) == 0:
                 if len(self._pri2jobId2job) == 0: