2012-03-31 10 views
9

में जीयूआई तत्वों को अपडेट करना मैं कुछ समय के लिए शोध कर रहा था जानकारी पीईक्यूटी का उपयोग करके बहुप्रचारित प्रोग्राम कैसे करें, परिणाम दिखाने के लिए जीयूआई अपडेट करना।मल्टी थ्रेडेड पीईक्यूटी

मुझे उदाहरण के द्वारा सीखने के लिए उपयोग किया जाता है और मुझे नहीं मिल रहा है (हाँ मैं हफ्तों की तलाश कर रहा था) इस तरह के सरल कार्य करने वाले मल्टीथ्रेडिंग का उपयोग करके कार्यक्रम का कोई आसान उदाहरण उदाहरण के लिए www साइटों (5 धागे) की सूची से जुड़ना और सिर्फ प्रतिक्रिया कोड के साथ प्रसंस्कृत यूआरएल मुद्रण।

क्या कोई भी कोड साझा कर सकता है या मुझे अच्छे ट्यूटोरियल में भेज सकता है जहां इस तरह के कार्यक्रम को समझाया गया है?

+0

अरे, मैंने pyqt की कोशिश नहीं की है, लेकिन मैंने pygtk में multithreading का उपयोग किया है। Pygtk में, gobject आमतौर पर ऐसा करने के लिए प्रयोग किया जाता है। आपको पीईक्यूटी के लिए कुछ इसी तरह की खोज करनी चाहिए। – Froyo

+0

यह भी देखें http://stackoverflow.com/questions/11265812/pyside-pyqt-starting-a-cpu-intensive-thread-hangs-the-whole- appplication, http://stackoverflow.com/questions/16879971/example -ऑफ-द-राइट-वे-टू-यूज-क्विड्रेड-इन-पिक्ट, http://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt या http://stackoverflow.com/प्रश्न/20752154/pyqt-connecting-a-signal-to-a-slot-to-start-a-background-operation – Trilarion

उत्तर

22

यहां कुछ बहुत ही बुनियादी उदाहरण हैं।

आप जीयूआई तत्वों के धागे के संदर्भों को संदर्भित कर सकते हैं, और उन्हें थ्रेड में अपडेट कर सकते हैं।

import sys 
import urllib2 

from PyQt4 import QtCore, QtGui 


class DownloadThread(QtCore.QThread): 
    def __init__(self, url, list_widget): 
     QtCore.QThread.__init__(self) 
     self.url = url 
     self.list_widget = list_widget 

    def run(self): 
     info = urllib2.urlopen(self.url).info() 
     self.list_widget.addItem('%s\n%s' % (self.url, info)) 


class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.list_widget = QtGui.QListWidget() 
     self.button = QtGui.QPushButton("Start") 
     self.button.clicked.connect(self.start_download) 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button) 
     layout.addWidget(self.list_widget) 
     self.setLayout(layout) 

    def start_download(self): 
     urls = ['http://google.com', 'http://twitter.com', 'http://yandex.ru', 
       'http://stackoverflow.com/', 'http://www.youtube.com/'] 
     self.threads = [] 
     for url in urls: 
      downloader = DownloadThread(url, self.list_widget) 
      self.threads.append(downloader) 
      downloader.start() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.resize(640, 480) 
    window.show() 
    sys.exit(app.exec_()) 

संपादकों नोट: क्यूटी विजेट सुरक्षित थ्रेड नहीं कर रहे हैं और किसी भी धागा लेकिन मुख्य थ्रेड (अधिक जानकारी के लिए Qt documentation देखें) तक पहुँच नहीं किया जाना चाहिए। धागे का उपयोग करने का सही तरीका सिग्नल/स्लॉट के माध्यम से होता है क्योंकि इस उत्तर के दूसरे भाग से पता चलता है।


इसके अलावा, आप संकेतों और स्लॉटों का इस्तेमाल कर सकते हैं, जीयूआई और नेटवर्क तर्क अलग करने के लिए।

import sys 
import urllib2 

from PyQt4 import QtCore, QtGui 


class DownloadThread(QtCore.QThread): 

    data_downloaded = QtCore.pyqtSignal(object) 

    def __init__(self, url): 
     QtCore.QThread.__init__(self) 
     self.url = url 

    def run(self): 
     info = urllib2.urlopen(self.url).info() 
     self.data_downloaded.emit('%s\n%s' % (self.url, info)) 


class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.list_widget = QtGui.QListWidget() 
     self.button = QtGui.QPushButton("Start") 
     self.button.clicked.connect(self.start_download) 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button) 
     layout.addWidget(self.list_widget) 
     self.setLayout(layout) 

    def start_download(self): 
     urls = ['http://google.com', 'http://twitter.com', 'http://yandex.ru', 
       'http://stackoverflow.com/', 'http://www.youtube.com/'] 
     self.threads = [] 
     for url in urls: 
      downloader = DownloadThread(url) 
      downloader.data_downloaded.connect(self.on_data_ready) 
      self.threads.append(downloader) 
      downloader.start() 

    def on_data_ready(self, data): 
     print data 
     self.list_widget.addItem(unicode(data)) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.resize(640, 480) 
    window.show() 
    sys.exit(app.exec_()) 
+0

मैं इन उदाहरणों का विश्लेषण करूंगा। धन्यवाद। प्रदर्शन तर्क से थ्रेडिंग को अलग करने के लिए सिग्नल का उपयोग करके सुझाव देने के लिए – Nuncjo

+1

+1। – Whatang

+0

उदाहरण बहुत अच्छे हैं जो मैं खोज रहा था लेकिन थ्रेड संख्या को 5 कार्य करने के लिए कैसे सीमित करना है? – Nuncjo