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."
私が仕事からコードを移動した場合()、それはすべて大丈夫だ、スレッドのものを取り除く、つかむために。
'self.update_observers()は何をしますか? GUIと対話しようとすると、別のスレッドから呼び出すことができない場合があります。 – Duncan
これは強制的にGUIの更新を行いますが、同じ結果を得ずに試してみました。 私が持っている別のプログラム(MEncoder用のインターフェイス)では、このアプローチがうまくいきました。 –
あなたの問題は同期の問題のように聞こえるが、スニペットにはスレッドコードは含まれていない。どのようにスレッドを開始するのか、そして 'update_observers()'がステータスの更新を報告するために何をしたらよいか教えてください。 –