2011-12-05 15 views
0

私はWebページのコードをダウンロードするアプリケーションを開発中で、リンクをキャプチャしています。 これは動作しますが、プログラムをGUIに接続すると、ダウンロードが完了するまで対応するボタンがロックされます。urllib2.urlopenは別のスレッドでは動作しません

ボタンロックを回避するために、別のスレッドでダウンロードを開始すると、フリーズして実行が完了しません。

これは正常ですか?または私は何かを逃していますか?

以下はコードのスニペットです。別のスレッドからgrab()を呼び出すと、何も起こりませんし、エラーも発生しません。

関数update_observers()はオブザーバに通知し、elseを実行しません。 この場合、GUIを再描画することによって、オブザーバが責任を負います。

def grab(self, url):   
     try: 
      self._status = 'Downloading page.' 
      self.update_observers() 
      inpu = urllib2.urlopen(url) 

     except URLError, e: 
      self._status = 'Error: '+ e.reason 
      self.update_observers() 
      return None 

     resp = [] 
     self._status = 'Parsing links' 
     self.update_observers() 
     for line in inpu.readlines(): 
      for reg in self._regexes: 
       links = reg.findall(line) 
       for link in links: 
        resp.append(link) 

     self._status = 'Ready.' 
     self.update_observers() 
     return resp 

このコードはここに呼び出されます。

def grab(self, widget): 
    t = Thread(target=self.work) 
    t.setDaemon(True) 
    t.start() 

def work(self): 
    print "Working" 
    self.links = None 
    self.links = self.grabber.grab(self.txtLink.get_text()) 
    for link in self.links: 
     self.store.append([link]) 
    print "Ok." 

私が仕事からコードを移動した場合()、それはすべて大丈夫だ、スレッドのものを取り除く、つかむために。

+0

'self.update_observers()は何をしますか? GUIと対話しようとすると、別のスレッドから呼び出すことができない場合があります。 – Duncan

+0

これは強制的にGUIの更新を行いますが、同じ結果を得ずに試してみました。 私が持っている別のプログラム(MEncoder用のインターフェイス)では、このアプローチがうまくいきました。 –

+0

あなたの問題は同期の問題のように聞こえるが、スニペットにはスレッドコードは含まれていない。どのようにスレッドを開始するのか、そして 'update_observers()'がステータスの更新を報告するために何をしたらよいか教えてください。 –

答えて

0

私はちょうどをgtk.main()の前に呼びましたが、すべて変更なしですべて正常に機能しました。

関連する問題