From 7b0a74bb9900e1766c626fa1c2e59e5c384007f5 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Wed, 13 May 2015 17:30:47 +0200 Subject: [PATCH] Removing Loader thread, everythings works better... Damn QThread --- src/cutecoin/core/app.py | 3 +- src/cutecoin/core/net/discover/network.py | 19 +++++--- src/cutecoin/core/net/discover/node.py | 59 ++++++++++------------- src/cutecoin/gui/mainwindow.py | 11 ++--- 4 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/cutecoin/core/app.py b/src/cutecoin/core/app.py index 2a9654f5..199a25f6 100644 --- a/src/cutecoin/core/app.py +++ b/src/cutecoin/core/app.py @@ -48,8 +48,7 @@ class Application(QObject): self.available_version = __version__ self._network_manager = QNetworkAccessManager(self) config.parse_arguments(argv) - self._network_manager.finished.connect(lambda reply: logging.debug("Thread : {0} , Network : {1}".format(self.thread(), - reply.url().toString()))) + self._network_manager.finished.connect(lambda reply: logging.debug("Network : {0}".format(reply.url().toString()))) self.get_last_version() self.preferences = {'account': "", 'lang': 'en_GB', diff --git a/src/cutecoin/core/net/discover/network.py b/src/cutecoin/core/net/discover/network.py index 81c3d6a8..02aac763 100644 --- a/src/cutecoin/core/net/discover/network.py +++ b/src/cutecoin/core/net/discover/network.py @@ -7,6 +7,7 @@ from .node import Node import logging import time +from ucoinpy.documents.peer import Peer from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QCoreApplication, QTimer @@ -150,7 +151,6 @@ class Network(QObject): self._nodes.append(node) node.changed.connect(self.handle_change) node.neighbour_found.connect(self.handle_new_node) - node.destroyed.connect(lambda: logging.debug("Node destroyed")) logging.debug("{:} connected".format(node.pubkey[:5])) def add_root_node(self, node): @@ -184,13 +184,19 @@ class Network(QObject): Start crawling which never stops. To stop this crawling, call "stop_crawling" method. ''' - self._must_crawl = True - self._is_perpetual = True - for node in self.nodes: - node.refresh() + if not self.continue_crawling(): + return + for (i, node) in enumerate(self.nodes): + if not self.continue_crawling(): + return - @pyqtSlot() + if node == self.nodes[-1]: + QTimer.singleShot((i+1)*10000, self.discover_network) + QTimer.singleShot(i*10000, node.refresh) + + @pyqtSlot(Peer) def handle_new_node(self, peer): + logging.debug("New node found : {0}".format(peer.pubkey[:5])) pubkeys = [n.pubkey for n in self.nodes] if peer.pubkey not in pubkeys: node = Node.from_peer(self._currency, peer) @@ -210,4 +216,5 @@ class Network(QObject): logging.debug("{0} -> {1}".format(self.latest_block, self.latest_block)) if self._block_found < self.latest_block: logging.debug("New block found : {0}".format(self.latest_block)) + self._block_found = self.latest_block self.new_block_mined.emit(self.latest_block) diff --git a/src/cutecoin/core/net/discover/node.py b/src/cutecoin/core/net/discover/node.py index 22e8af66..7f1d6627 100644 --- a/src/cutecoin/core/net/discover/node.py +++ b/src/cutecoin/core/net/discover/node.py @@ -43,7 +43,7 @@ class Node(QObject): neighbour_found = pyqtSignal(Peer) def __init__(self, network_manager, currency, endpoints, uid, pubkey, block, - state, last_change): + state, last_change, last_merkle): ''' Constructor ''' @@ -57,6 +57,7 @@ class Node(QObject): self._neighbours = [] self._currency = currency self._last_change = last_change + self._last_merkle = last_merkle @classmethod def from_address(cls, network_manager, currency, address, port): @@ -78,8 +79,8 @@ class Node(QObject): raise InvalidNodeCurrency(peer.currency, currency) node = cls(network_manager, peer.currency, peer.endpoints, - "", peer.pubkey, 0, - Node.ONLINE, time.time()) + "", peer.pubkey, 0, Node.ONLINE, time.time(), + {'root': "", 'leaves': []}) logging.debug("Node from address : {:}".format(str(node))) return node @@ -97,7 +98,8 @@ class Node(QObject): raise InvalidNodeCurrency(peer.currency, currency) node = cls(network_manager, peer.currency, peer.endpoints, "", "", 0, - Node.ONLINE, time.time()) + Node.ONLINE, time.time(), + {'root': "", 'leaves': []}) logging.debug("Node from peer : {:}".format(str(node))) return node @@ -135,7 +137,8 @@ class Node(QObject): node = cls(network_manager, currency, endpoints, uid, pubkey, block, - state, last_change) + state, last_change, + {'root': "", 'leaves': []}) logging.debug("Node from json : {:}".format(str(node))) return node @@ -249,20 +252,12 @@ class Node(QObject): logging.debug("Requesting {0}".format(conn_handler)) reply = qtbma.blockchain.Current(conn_handler).get() - reply.finished.connect(lambda: self.handle_block_reply(reply)) + reply.finished.connect(self.handle_block_reply) @pyqtSlot() - def handle_block_reply(self, reply): - logging.debug("Handle block reply") - #reply = self.sender() - logging.debug("Found thread : {0}".format(self.thread())) - logging.debug("Found reply : {0}".format(reply)) - logging.debug("Found sender : {0}".format(self.sender())) - logging.debug("Found url : {0}".format(reply.url().toString())) - logging.debug("Found manager : {0}".format(reply.manager())) + def handle_block_reply(self): + reply = self.sender() status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - logging.debug("Status code : {0}".format(status_code)) - logging.debug("Error : {0}".format(reply.error())) if self.check_noerror(reply.error(), status_code): if status_code == 200: @@ -287,11 +282,10 @@ class Node(QObject): self.endpoint.conn_handler().port) peering_reply = qtbma.network.Peering(conn_handler).get() - peering_reply.finished.connect(lambda: self.handle_peering_reply(peering_reply)) + peering_reply.finished.connect(self.handle_peering_reply) @pyqtSlot() - def handle_peering_reply(self, reply): - logging.debug("Handle peering reply") + def handle_peering_reply(self): reply = self.sender() status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -321,13 +315,12 @@ class Node(QObject): self.endpoint.conn_handler().server, self.endpoint.conn_handler().port) uid_reply = qtbma.wot.Lookup(conn_handler, self.pubkey).get() - uid_reply.finished.connect(lambda: self.handle_uid_reply(uid_reply)) + uid_reply.finished.connect(self.handle_uid_reply) uid_reply.error.connect(lambda code: logging.debug("Error : {0}".format(code))) @pyqtSlot() - def handle_uid_reply(self, reply): - logging.debug("Handle uid reply") - #reply = self.sender() + def handle_uid_reply(self): + reply = self.sender() status_code = reply.attribute( QNetworkRequest.HttpStatusCodeAttribute ); if self.check_noerror(reply.error(), status_code): @@ -358,34 +351,34 @@ class Node(QObject): self.endpoint.conn_handler().port) reply = qtbma.network.peering.Peers(conn_handler).get(leaves='true') - reply.finished.connect(lambda: self.handle_peers_reply(reply)) + reply.finished.connect(self.handle_peers_reply) reply.error.connect(lambda code: logging.debug("Error : {0}".format(code))) @pyqtSlot() - def handle_peers_reply(self, reply): - logging.debug("Handle peers reply") - #reply = self.sender() + def handle_peers_reply(self): + reply = self.sender() status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) if self.check_noerror(reply.error(), status_code): strdata = bytes(reply.readAll()).decode('utf-8') peers_data = json.loads(strdata) - if True: #peers_data['root'] != self._last_root: - leaves = [leaf for leaf in peers_data['leaves']] - #if leaf not in self._last_leaves] + if peers_data['root'] != self._last_merkle['root']: + leaves = [leaf for leaf in peers_data['leaves'] + if leaf not in self._last_merkle['leaves']] for leaf_hash in leaves: conn_handler = ConnectionHandler(self.network_manager, self.endpoint.conn_handler().server, self.endpoint.conn_handler().port) leaf_reply = qtbma.network.peering.Peers(conn_handler).get(leaf=leaf_hash) - leaf_reply.finished.connect(lambda: self.handle_leaf_reply(leaf_reply)) + leaf_reply.finished.connect(self.handle_leaf_reply) + self._last_merkle = {'root' : peers_data['root'], + 'leaves': peers_data['leaves']} else: logging.debug("Error in peers reply") @pyqtSlot() - def handle_leaf_reply(self, reply): - logging.debug("Handle leaf reply") + def handle_leaf_reply(self): reply = self.sender() status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py index 7ea2d5c5..4343277c 100644 --- a/src/cutecoin/gui/mainwindow.py +++ b/src/cutecoin/gui/mainwindow.py @@ -9,7 +9,7 @@ from ..gen_resources.about_uic import Ui_AboutPopup from PyQt5.QtWidgets import QMainWindow, QAction, QFileDialog, QProgressBar, \ QMessageBox, QLabel, QComboBox, QDialog, QApplication from PyQt5.QtCore import QSignalMapper, QObject, QThread, \ - pyqtSlot, pyqtSignal, QDate, QDateTime, QTimer, QUrl, Qt + pyqtSlot, pyqtSignal, QDate, QDateTime, QTimer, QUrl, Qt, QCoreApplication from PyQt5.QtGui import QIcon, QDesktopServices, QPixmap from .process_cfg_account import ProcessConfigureAccount @@ -90,13 +90,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.statusbar.addPermanentWidget(self.combo_referential) self.update_time() - self.loader_thread = QThread() self.loader = Loader(self.app) - self.loader.moveToThread(self.loader_thread) self.loader.loaded.connect(self.loader_finished) - self.loader.loaded.connect(self.loader_thread.quit) self.loader.connection_error.connect(self.display_error) - self.loader_thread.started.connect(self.loader.load) self.homescreen = HomeScreenWidget(self.app) self.centralWidget().layout().addWidget(self.homescreen) @@ -159,6 +155,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): logging.debug("Busybar : {:} : {:}".format(value, maximum)) self.busybar.setValue(value) self.busybar.setMaximum(maximum) + QApplication.processEvents() if self.app.current_account: self.app.save_cache(self.app.current_account) @@ -173,7 +170,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.busybar.show() self.status_label.setText(self.tr("Loading account {0}").format(account_name)) self.loader.set_account_name(account_name) - self.loader_thread.start(QThread.LowPriority) + QTimer.singleShot(1000, self.loader.load) self.homescreen.button_new.hide() self.homescreen.button_import.hide() @@ -371,8 +368,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): if self.app.current_account: self.app.save_cache(self.app.current_account) self.app.save_persons() - self.loader.deleteLater() - self.loader_thread.deleteLater() super().closeEvent(event) def showEvent(self, event): -- GitLab