def runInUIThread(func): def decorate(*args, **kw): d = Deferred() if thread.get_ident() == UI_Thread: try: d.callback(func(*args, **kw)) except: d.errback() else: def callback(): try: result = func(*args, **kw) except: f = failure.Failure() reactor.callFromThread(d.errback, f) else: reactor.callFromThread(d.callback, result) PostAsyncEvent(callback) return d return decorate