[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.
|