2013-12-23 49 views
1

我有一個程序主要由一個QMainWindow組成。但我添加了一些「插件」,這些插件做了一些特定的事情。他們中的一個,例如分析thepiratebay返回一個類別的最新的洪流,把他們在一個數據庫:解析一個線程

def parse(self): 
    bdd = sqlite3.connect("fichiers.sqlite") 
    bdd.row_factory = sqlite3.Row 

    c = bdd.cursor() # obtention d'un curseur 
    c.execute("SELECT * FROM pirate ORDER BY id ASC LIMIT 1") 

    try: 
     last_title = c.fetchone()['title'] 
     print("Dernier titre: " + last_title) 
    except TypeError: 
     last_title = "" 

    search = self.t.search('*', category=CATEGORIES.VIDEOS.MOVIES) 

    go = True 
    j = 0 
    for i in range(0, 34): 
     print(i) 
     search.order(ORDERS.UPLOADED.DES).page(i) 

     for torrent in search: 
      if torrent.title == last_title: 
       print("on sort") 
       go = False 
       break 

      print(torrent.title) 
      j += 1 
      c.execute("INSERT INTO pirate(title, title_simple, user, magnet_link, \ 
         url, created, size) VALUES (?, ?, ?, ?, ?, ?, ?)", \ 
         (torrent.title, simpleChar(torrent.title), torrent.user, torrent.magnet_link, 
         str(torrent.url), torrent.created, strByteToOctet(torrent.size)[1])) 

     if not go: 
      break 

    print(j) 
    bdd.commit() 
    c.close() 
    bdd.close() 

    self.modele.setTable("pirate") 
    self.modele.select() 

但是,當我這樣做,在我的Qt的程序,該程序的其餘部分等到函數結束解析。我使用的API向網站發送請求,所以有時候會有點長。所以問題是:

如何解析而不等待此功能的結束?我希望Qt程序能夠在一個線程中啓動它,而不會阻塞其餘部分。

+1

在Qt中使用線程很方便。你應該閱讀你的圖書館教程(pyqt或pyside),並嘗試自己寫一些東西。如果遇到任何特定問題,則應編輯添加問題的問題。 –

+0

發現它:http://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt。我猜不出這很容易。我只需要讓我的類從QThread繼承,並將我的函數解析重命名爲run,就是這樣。 – Rififi

回答

0

正如你指出你自己,使用基於QThread自定義線程需要最初兩件事情:

1)QThread繼承。

2)您需要重新實現啓動方法將基於模板方法模式調用的虛擬保護run方法。

這對於初學者來說非常適合,然後你可以開始你的線程。有一次,你走得更遠,你可能需要處理線程池等等,但這是爲了以後。 strong text