2012-12-19 73 views
1

這裏的情況: 我有一個類加載特定的網址,也有一個參數列表,我需要發送到這個網址。我希望使用線程來同時加載這個URL,換句話說,不是加載一個QWebView,而是加載另一個QWebView,我想一次打開5個窗口。PyQt4 QWebView的多線程

好吧,現在問題是,每個窗口都會有不同的速度,所以我需要跟蹤哪些參數正在使用。

例如:

params = [1,2,3,4,5,6,7] 
a = MyClass(1) 
b = MyClass(2) 
c = MyClass(3) 

現在如果讓我們說B類已經完成befoure其他2類,它會得到價值4,並再次啓動它。

這是示例代碼:

#! /usr/bin/env python2.7 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 
import sys, signal 

class Grabber(QWebView): 
    def __init__(self, param=None): 
     QWebView.__init__(self) 
     self.loadFinished.connect(self._loadComplete) 
     url = QUrl('http://some website.com/search?param=%s'%param) 
     self.load(url) 
     self.show() 

    def _loadComplete(self): 
     print "Done" 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    # Dont know what to do with the next 2 lines 
    thread_pool = QThreadPool() 
    thread_pool.setMaxThreadCount(10) 

    param = [1,2,3,4,5,6,7,8,9,10,11,12] # and so on 

    # Whant to achive something similar: 
    for i in param: 
     a = Grabber(i) 
     b = Grabber(i) 
     c = Grabber(i) 
     d = Grabber(i) 
     e = Grabber(i) 

    if signal.signal(signal.SIGINT, signal.SIG_DFL): 
     sys.exit(app.exec_()) 
    app.exec_() 

我敢肯定我需要使用線程,醚蟒蛇本地線程或PyQt4中的QThread。

+1

不知道它究竟是如何在Python/PyQt的實現,但它聽起來像你AFER是隊列結構每次抓取器完成其​​工作時,可以調用pop()以獲取下一個值。只要確保在某種類型的線程鎖(例如互斥鎖)中將調用包裝爲pop(),以便一次只有一個線程嘗試調用pop。不是一個真正的答案(因此在評論中),但應該給你一些條款谷歌的解決方案;) –

+0

謝謝,沒有想到它,但聲音很棒 – Vor

+0

@Vor結帳我的答案,我編輯它返回'grabber'對象 – 2012-12-19 17:19:04

回答

1

看看是否有這樣的工作。 bookie類所做的是將loadFinished被調用的次數存儲到變量count中,並返回列表params中的相應項目。在創建grabber對象時,它將其映射到QSignalMapper的數字,因此您可以通過調用mapper.mapping(id-of-grabber-object)來檢索信號的發送者。您可以繼續嘗試這個代碼,看看它是否適合你修改你的面前:

#!/usr/bin/env python 
from PyQt4.QtCore import pyqtSlot, QObject, QSignalMapper, QTimer 
from PyQt4.QtGui import QApplication 
from PyQt4.QtWebKit import QWebView 


class bookie(QObject): 
    def __init__(self, parent=None): 
     super(bookie, self).__init__(parent) 

     self.count = 0 
     self.url = 'http://some website.com/search?param={0}' 
     self.params = range(100) # instead of [1,2,3,4,5,6,7,8,9,10,11,12] and so on... 

     Grabber = QWebView # This would be your Grabber class 

     self.mapper = QSignalMapper(self) 
     self.mapper.mapped.connect(self.on_mapper_mapped) 

     for grabberNumber in range(10): # Create 10 Grabber instances 
      grabber = Grabber() 
      grabber.loadFinished.connect(self.mapper.map) 

      self.mapper.setMapping(grabber, grabberNumber) 

      grabber.loadFinished.emit(True) # Initialize the grabber by emitting loadFinished 

    def on_mapper_mapped(self, gNumber): 
     self.count += 1 
     if self.count < len(self.params): 
      gParam = self.params[self.count] 
      grabber = self.mapper.mapping(gNumber) 
      #grabber.load(QUrl(self.url.format(gParam))) 

      # Next 2 lines for testing purposes, remove & uncomment the previous line 

      print "GRABBER:", gNumber, "PARAMETER:", gParam 
      QTimer.singleShot(1, lambda:grabber.loadFinished.emit(True)) 

if __name__ == "__main__": 
    import sys 

    app = QApplication(sys.argv) 
    main = bookie() 
+0

非常感謝你的回答! – Vor

+0

你可以請看看,我做錯了什麼,我打開了一個新的問題,因爲不想做我的更新到很長時間,所以這裏是一個問題:'''''http://stackoverflow.com/questions/13960040/開放式的多網頁與 - 不同-parametrs-pyqt4' – Vor