]> code.delx.au - notipod/commitdiff
Run slow stuff in a background thread for improved responsiveness
authorJames Bunton <jamesbunton@fastmail.fm>
Sun, 2 Jan 2011 13:38:42 +0000 (00:38 +1100)
committerJames Bunton <jamesbunton@fastmail.fm>
Sun, 2 Jan 2011 13:38:42 +0000 (00:38 +1100)
NotiPod.py

index 47ffb1cb9510ecc4a5048b9cd291a60173520464..3ea25bf2143a9aa017e07103c0e49cfd9fb39a4f 100644 (file)
@@ -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):