Advertisement
reclosedev

QThreadPool QRuanable signals workaround

Apr 7th, 2012
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. import sys
  2. import urllib2
  3.  
  4. from PyQt4 import QtCore, QtGui
  5.  
  6.  
  7. class SignalHelper(QtCore.QObject):
  8.     data_downloaded = QtCore.pyqtSignal(object)
  9.  
  10.  
  11. class DownloadThread(QtCore.QRunnable):
  12.     def __init__(self, url):
  13.         QtCore.QRunnable.__init__(self)
  14.         self.url = url
  15.         self._signal_helper = SignalHelper()
  16.         self.data_downloaded = self._signal_helper.data_downloaded
  17.  
  18.     def run(self):
  19.         print 'thread', QtCore.QThread.currentThread()
  20.         info = urllib2.urlopen(self.url).info()
  21.         self.data_downloaded.emit('%s\n%s' % (self.url, info))
  22.        
  23.  
  24. class MainWindow(QtGui.QWidget):
  25.     def __init__(self):
  26.         super(MainWindow, self).__init__()
  27.         self.list_widget = QtGui.QListWidget()
  28.         self.button = QtGui.QPushButton("Start")
  29.         self.button.clicked.connect(self.start_download)
  30.         layout = QtGui.QVBoxLayout()
  31.         layout.addWidget(self.button)
  32.         layout.addWidget(self.list_widget)
  33.         self.setLayout(layout)
  34.         #
  35.         ## Thread pool with maximum 2 simultaneously running threads
  36.         #
  37.         self.thread_pool = QtCore.QThreadPool()
  38.         self.thread_pool.setMaxThreadCount(2)
  39.  
  40.     def start_download(self):
  41.         urls = ['http://google.com', 'http://twitter.com', 'http://yandex.ru',
  42.                 'http://stackoverflow.com/', 'http://www.youtube.com/']
  43.         for url in urls:
  44.             downloader = DownloadThread(url)
  45.             downloader.data_downloaded.connect(self.on_data_ready)
  46.             self.thread_pool.start(downloader)
  47.  
  48.     def on_data_ready(self, data):
  49.         self.list_widget.addItem(data)
  50.  
  51.  
  52.  
  53. if __name__ == "__main__":
  54.     app = QtGui.QApplication(sys.argv)
  55.     window = MainWindow()
  56.     window.resize(640, 480)
  57.     window.show()
  58.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement