[Clippy-commits] SF.net SVN: clippy:[12] clippy
Status: Pre-Alpha
Brought to you by:
edheldil
From: <edh...@us...> - 2010-03-05 10:08:17
|
Revision: 12 http://clippy.svn.sourceforge.net/clippy/?rev=12&view=rev Author: edheldil Date: 2010-03-05 10:08:12 +0000 (Fri, 05 Mar 2010) Log Message: ----------- Implemented simple asynchronous execution Modified Paths: -------------- clippy/ui/assistant/win_main.py Added Paths: ----------- clippy/worker.py Modified: clippy/ui/assistant/win_main.py =================================================================== --- clippy/ui/assistant/win_main.py 2010-03-05 10:07:27 UTC (rev 11) +++ clippy/ui/assistant/win_main.py 2010-03-05 10:08:12 UTC (rev 12) @@ -6,8 +6,10 @@ import gtk import pango import string +import thread +import time -from clippy import loader, repository, utils +from clippy import loader, repository, utils, worker from clippy.query import Query from clippy.ui import glfactory @@ -281,6 +283,20 @@ self.handle_tree_repos_cursor_changed (tree) + def run_async (self, job_fns, idle_fn, end_fn): + if True: + jobs = [ worker.Job (job_fn) for job_fn in job_fns ] + [ worker.input.put (job) for job in jobs ] + gtk.idle_add (idle_fn, (jobs, end_fn)) + #time.sleep (0.001) + thread.interrupt_main () + return jobs + else: + res = [ fn () for fn in job_fns ] + end_fn (res) + return None + + def update_item_list (self): tree = self['tree_items'] model = self.model_items @@ -288,7 +304,6 @@ # FIXME: should also disable sorting model.clear () - items = [] items_src = [] items_tgt = [] @@ -299,9 +314,6 @@ repo = app.repo_target qry = Query (repo) repo.connect () - items_tgt = repo.getItems (qry) - for item in items_tgt: - item['_origin'] = 'tgt' except Exception, e: print "Can't get target items:", e @@ -309,12 +321,24 @@ repo = app.repo_source qry = Query (repo) repo.connect () - items_src = repo.getItems (qry) - for item in items_src: - item['_origin'] = 'src' except Exception, e: print "Can't get source items:", e + + self.run_async ((lambda: app.repo_target.getItems (qry), lambda: app.repo_source.getItems (qry)), self.update_item_list_idle, self.update_item_list_end) + + def update_item_list_end (self, results): + tree = self['tree_items'] + items = [] + model = self.model_items + items_tgt = results[0] + items_src = results[1] + for item in items_tgt: + item['_origin'] = 'tgt' + + for item in items_src: + item['_origin'] = 'src' + # FIXME: this part should be in core if app.item_list_mode in ['both', 'tgt', 'merge']: @@ -353,7 +377,16 @@ #self['treecaches'].set_model (self.model_caches) tree.thaw_child_notify () + def update_item_list_idle (self, data): + print 'x', + jobs, end_fn = data + if jobs[0].is_done () and jobs[1].is_done (): + end_fn ([ job.result for job in jobs ]) + else: + gtk.idle_add (self.update_item_list_idle, data) + # update throbber + def handle_open_metadata (self, *args): try: win = app.windows['win_metadata'] Added: clippy/worker.py =================================================================== --- clippy/worker.py (rev 0) +++ clippy/worker.py 2010-03-05 10:08:12 UTC (rev 12) @@ -0,0 +1,36 @@ +# -*-python-*- +# vim: set ts=4 sw=4 expandtab: + +import threading +import Queue + +input = Queue.Queue () + +class Worker (threading.Thread): + def run (self): + while True: + job = input.get () + # Empty action causes the worker to terminate + if not job.action: + break + res = job.action () + job.set_result (1, res) + +class Job: + def __init__ (self, action): + self.status = 0 + self.action = action + self.result = None + + def set_result (self, status, result): + self.result = result + self.status = status + + def is_done (self): + return self.status != 0 + +wrk = Worker () +wrk.setDaemon (True) +wrk.start () + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |