From 5195da67ab546a208083e7ac575ed1e5d4c3d05d Mon Sep 17 00:00:00 2001 From: Dave Schuyler Date: Wed, 6 Apr 2005 03:00:58 +0000 Subject: [PATCH] *** empty log message *** --- direct/src/distributed/AsyncRequest.py | 44 ++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/direct/src/distributed/AsyncRequest.py b/direct/src/distributed/AsyncRequest.py index 187d0fbb6e..c4e2c789a7 100755 --- a/direct/src/distributed/AsyncRequest.py +++ b/direct/src/distributed/AsyncRequest.py @@ -5,10 +5,43 @@ from direct.showbase.DirectObject import DirectObject class AsyncRequest(DirectObject): - def __init__(self, manager, air, replyToChannelId=None, timeout=4.0): + """ + This class is used to make asynchronos reads and creates to a database. + + You can create a list of self.neededObjects and then ask for each to be + read or created, or if you only have one object that you need you can + skip the self.neededObjects because calling askForObject or createObject + will set the self.neededObjects value for you. + + Once all the objects have been read or created, the self.finish() method + will be called. You may override this function to run your code in a + derived class. + + If you wish to queue up several items that you all need before the finish + method is called, you can put items in self.neededObjects and then call + askForObject or createObject afterwards. That way the _checkCompletion + will not call finish until after all the requests have been done. + + If you need to chain serveral object reads or creates, just add more + entries to the self.neededObjects dictionary in the self.finish function + and return without calling AsyncRequest.finish(). Your finish method + will be called again when the new self.neededObjects is complete. You + may repeat this as necessary. + """ + + if __debug__: + notify = DirectNotifyGlobal.directNotify.newCategory('AsyncRequest') + + def __init__(self, distObj, air, replyToChannelId=None, timeout=4.0): + """ + distObj is any distributed object. + air is the AI Respository. + replyToChannelId may be an avatarId, an accountId, or a channelId. + timeout is how many seconds to wait before aborting the request. + """ assert self.notify.debugCall() #DirectObject.DirectObject.__init__(self) - self.manager=manager + self.distObj=distObj self.air=air self.replyToChannelId=replyToChannelId self.neededObjects={} @@ -30,7 +63,7 @@ class AsyncRequest(DirectObject): self.air.removeDOFromTables(i) i.delete() del self.neededObjects - del self.manager + del self.distObj del self.air del self.replyToChannelId #DirectObject.DirectObject.delete(self) @@ -64,7 +97,9 @@ class AsyncRequest(DirectObject): Request an already created object, i.e. read from database. """ assert self.notify.debugCall() + assert doId object = self.air.doId2do.get(doId) + self.neededObjects[doId]=object if object is not None: self._checkCompletion(None, context, object) else: @@ -79,6 +114,9 @@ class AsyncRequest(DirectObject): your self.finish() function. """ assert self.notify.debugCall() + assert name + assert className + self.neededObjects[name]=None if context is None: context=self.air.allocateContext() self.accept("doRequestResponse-%s"%(context,), self._checkCompletion, [name])