+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')
# 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
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")