tDo slow price discovery in another thread to speed up startup time and responsiveness. - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit bd489e998fe159ad662830ec1d60f8acec4e133d DIR parent 9fd9f27408209787f419ac4a1ecd268252b12382 HTML Author: Amir Taaki <genjix@riseup.net> Date: Mon, 2 Jul 2012 22:39:45 +0200 Do slow price discovery in another thread to speed up startup time and responsiveness. Diffstat: M lib/exchange_rate.py | 38 +++++++++++++++++++++---------- M lib/gui_lite.py | 7 ++++--- 2 files changed, 30 insertions(+), 15 deletions(-) --- DIR diff --git a/lib/exchange_rate.py b/lib/exchange_rate.py t@@ -1,19 +1,31 @@ +from PyQt4.QtCore import SIGNAL import decimal import httplib import json +import threading -class Exchanger: +class Exchanger(threading.Thread): - def __init__(self, quote_currencies, refresh_balance): - self.refresh_balance = refresh_balance + def __init__(self, parent): + threading.Thread.__init__(self) + self.daemon = True + self.parent = parent self.quote_currencies = None + self.lock = threading.Lock() + # Do price discovery + self.start() def exchange(self, btc_amount, quote_currency): - if self.quote_currencies is None: + with self.lock: + if self.quote_currencies is None: + return None + quote_currencies = self.quote_currencies.copy() + if quote_currency not in quote_currencies: return None - if quote_currency not in self.quote_currencies: - return None - return btc_amount * self.quote_currencies[quote_currency] + return btc_amount * quote_currencies[quote_currency] + + def run(self): + self.discovery() def discovery(self): connection = httplib.HTTPSConnection('intersango.com') t@@ -26,12 +38,14 @@ class Exchanger: # 2 = BTC:EUR # 3 = BTC:USD # 4 = BTC:PLN - self.quote_currencies = {} + quote_currencies = {} try: - self.quote_currencies["GBP"] = self.lookup_rate(response, 1) - self.quote_currencies["EUR"] = self.lookup_rate(response, 2) - self.quote_currencies["USD"] = self.lookup_rate(response, 3) - self.refresh_balance() + quote_currencies["GBP"] = self.lookup_rate(response, 1) + quote_currencies["EUR"] = self.lookup_rate(response, 2) + quote_currencies["USD"] = self.lookup_rate(response, 3) + with self.lock: + self.quote_currencies = quote_currencies + self.parent.emit(SIGNAL("refresh_balance()")) except KeyError: pass DIR diff --git a/lib/gui_lite.py b/lib/gui_lite.py t@@ -105,9 +105,10 @@ class MiniWindow(QDialog): self.btc_balance = 0 self.quote_currencies = ("EUR", "USD", "GBP") - self.exchanger = exchange_rate.Exchanger(self.quote_currencies, - self.refresh_balance) - QTimer.singleShot(1000, self.exchanger.discovery) + self.exchanger = exchange_rate.Exchanger(self) + # Needed because price discovery is done in a different thread + # which needs to be sent back to this main one to update the GUI + self.connect(self, SIGNAL("refresh_balance()"), self.refresh_balance) self.balance_label = BalanceLabel(self.change_quote_currency) self.balance_label.setObjectName("balance_label")