From: James Bunton Date: Sun, 2 Jan 2011 13:38:42 +0000 (+1100) Subject: Run slow stuff in a background thread for improved responsiveness X-Git-Tag: notipod-1.1~1 X-Git-Url: https://code.delx.au/notipod/commitdiff_plain/1d3e90aac4bb5bd242f917bf6bcd1a87317ad498 Run slow stuff in a background thread for improved responsiveness --- diff --git a/NotiPod.py b/NotiPod.py index 47ffb1c..3ea25bf 100644 --- a/NotiPod.py +++ b/NotiPod.py @@ -133,31 +133,27 @@ class NotiPodAppDelegate(NSObject): # Utility methods def runGenerator(self, func, finish): NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None) - self.gen = func() - self.finish = finish - self.runGeneratorNext() - - def runGeneratorNext(self): - if self.gen is None or self.finish is None: - return - try: - msg = self.gen.next() - self.loadingLabel.setStringValue_(msg) - self.performSelector_withObject_afterDelay_( - self.runGeneratorNext, None, 0) - except StopIteration: - self.stopGenerator() - - def stopGenerator(self): - self.gen = None + arg = (func(), finish) + self.performSelectorInBackground_withObject_(self.runGeneratorThread, arg) + + def runGeneratorThread(self, (gen, finish)): + pool = NSAutoreleasePool.alloc().init() + for msg in gen: + self.loadingLabel.performSelectorOnMainThread_withObject_waitUntilDone_( + self.loadingLabel.setStringValue_, msg, True) + self.performSelectorOnMainThread_withObject_waitUntilDone_( + self.stopGenerator, finish, True) + del pool + + def stopGenerator(self, finish): NSApp.endSheet_(self.loadingSheet) self.loadingSheet.orderOut_(self) - self.finish() - self.finish = None + if finish: + finish() @objc.IBAction def doCancel_(self, sender): - self.stopGenerator() + self.stopGenerator(None) @objc.IBAction def doSync_(self, sender):