[Pymoul-svn] SF.net SVN: pymoul: [117] pymoul/trunk/src/moul/qt
Status: Alpha
Brought to you by:
tiran
|
From: <ti...@us...> - 2007-02-02 03:49:54
|
Revision: 117
http://pymoul.svn.sourceforge.net/pymoul/?rev=117&view=rev
Author: tiran
Date: 2007-02-01 19:49:46 -0800 (Thu, 01 Feb 2007)
Log Message:
-----------
Run localization loading in a Threadlet
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/localization.py
pymoul/trunk/src/moul/qt/threadlet.py
Modified: pymoul/trunk/src/moul/qt/localization.py
===================================================================
--- pymoul/trunk/src/moul/qt/localization.py 2007-02-02 03:32:28 UTC (rev 116)
+++ pymoul/trunk/src/moul/qt/localization.py 2007-02-02 03:49:46 UTC (rev 117)
@@ -36,6 +36,7 @@
from moul.file.directory import UruGameDataDirectory
from moul.log import getLogger
from moul.log import signalLogDecorator
+from moul.qt.threadlet import Threadlet
LOG = getLogger('moul.loc')
@@ -52,8 +53,13 @@
self._gamedir = UruGameDataDirectory(installDir)
if not self._gamedir.exists('loc'):
return
+ self._journal_threadlet = Threadlet()
+ self.connect(self._journal_threadlet, SIGNAL('finished()'),
+ self.on_localization_loaded)
+ self._journal_threadlet.detach(self._gamedir.factory, 'loc')
- self._gamedir.factory('loc')
+ @signalLogDecorator(LOG)
+ def on_localization_loaded(self):
self.tab_sub_journals.setEnabled(True)
self._documents_state = {}
Modified: pymoul/trunk/src/moul/qt/threadlet.py
===================================================================
--- pymoul/trunk/src/moul/qt/threadlet.py 2007-02-02 03:32:28 UTC (rev 116)
+++ pymoul/trunk/src/moul/qt/threadlet.py 2007-02-02 03:49:46 UTC (rev 117)
@@ -26,11 +26,15 @@
import sys
from PyQt4 import QtCore
+from moul.log import getLogger
+from PyQt4.QtCore import SIGNAL
-LOG = getLogger('moul.tasklket')
+LOG = getLogger('moul.tasklet')
class Threadlet(QtCore.QThread):
"""Threadlet - execute a function in a seperate thread
+
+ Use this class to run a CPU or I/O bound function in a seperate thread.
@signal started(): Signal is emitted when the thread starts executing.
@signal finished(): Signal is emitted when the thread has finished.
@@ -40,9 +44,9 @@
>>> def pow(x, y): return x**y
>>> def printer(r): print r
- >>> example =Threadlet(pow, parent=None, 2, 6)
+ >>> example =Threadlet()
>>> connect(example, SIGNAL('done(result)'), printer)
- >>> example.start()
+ >>> example.detach(pow, 2, 6)
started()
done(result)
@@ -51,18 +55,29 @@
@warning: The function and all applied arguments must be reentrant or
thread safe!
"""
- def __init__(self, func, parent=None, *args, **kwargs):
+ def __init__(self, parent=None):
+ QtCore.QThread.__init__(self, parent)
+ self.mutex = QtCore.QMutex()
+ self._func = None
+ self._args = None
+ self._kwargs = None
+
+ def detach(self, func, *args, **kwargs):
"""
@param func: a callable
- @param parent: Qt parent
@param *args: additional arguments for the function
@param **kwargs: additional keyword arguments for the function
"""
- QtCore.QThread.__init__(self, parent)
+ self.mutex.lock()
self._func = func
self._args = args
self._kwargs = kwargs
+ self.mutex.unlock()
+ if not self.isRunning():
+ self.start()
def run(self):
+ self.mutex.lock()
result = self._func(*self._args, **self._kwargs)
self.emit(SIGNAL("done(result)"), result)
+ self.mutex.unlock()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|