編集:このリビジョン/更新前のこの質問の主な部分は、QThread を終了する方法でした。それは解決されました。質問は、進行中のリクエストの残りのオブジェクトを強制終了する方法に修正されています。
http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests 非同期リクエストを使用するとまだブロックされているようです - ユーザーは進行中の投稿をキャンセルできません。
基本的にこれが必要な機能です。ユーザーが を押すStop Uploadingと、アップロードは即座に停止する必要があります。stop() を使用してスレッドを停止できますが、ループが再びループした後に停止する必要があるかどうかのみがチェックされます。
したがって、基本的には、リクエスト中にキャンセルする必要があるかどうかを確認できる非同期リクエストを使用できるはずですが、方法がわかりません。
助言がありますか?投稿の前の部分はまだ関連性があるため、以下に示します。
QThread を終了する方法に関する最初の質問は解決されていることに注意してください。したがって、以下のコードはあまり重要ではありません。コンテキストのためだけです。今、私が助けを必要としているのは、私が説明したことです。
私はプログラムを書いてきました。それは写真アップローダーで、ファイルをアップロードするスレッドを作成しました。スレッドを終了する方法がわかりません。ここから読んだ提案を試しました:
1) bool フラグを試して、メソッドと作業を行う for ステートメントの両方をラップしました。
2) 「with」を使用してから、例外を設定しようとしました。
できればすぐに、アップロードをキャンセルできるようにしたいです。スレッドを終了する前にスレッドを「クリーンアップ」することが常に推奨されていることをよく読んだことがありますが、「クリーンアップ」が何を意味するのか正直にわかりません。しかし、私はスレッドを殺すことができるはずだと思います-それがしているのは画像のバイナリデータをTUMBLR APIに送信することだけだからです。APIでのアップロードもキャンセルされるだけなので、リクエストが早期にキャンセルされても問題ありません。
とにかく、ここに私のスレッドがあります:
class WorkThread(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) global w w = WorkThread def __del__(slf): self.wait() def run(self): url = 'https://www.tumblr.com/api/write' files = os.listdir(directory) for file in files: file_path = os.path.join(directory + '\\' + file) file_path = str(file_path) if file_path[-3:] in ['bmp', 'gif', 'jpg', 'png', 'thm', 'tif', 'yuv']: self.emit(QtCore.SIGNAL('update(QString)'), "Uploading %s ..." % file_path) print smart_str(password) data = {'email': email, 'password': password, 'type': 'photo'} with open(file_path, 'rb') as photo: r = requests.post(url, data=data, files={'data': photo}) print r.content self.emit(QtCore.SIGNAL('update(QString)'), 'All finished! Go check out your stuff on tumblr :)\n') return
これが私がそれを呼び出す方法です。
def upload(self): self.doneBox.clear() self.workThread = WorkThread() self.connect( self.workThread, QtCore.SIGNAL("update(QString)"), self.startUploading ) self.workThread.start()
スレッドをすばやく静かに終了できる方法を誰かが提案できますか? または、それが良くないと思う場合は、安全に停止する方法。
ただし、すぐに強制終了せず、メソッドで再度 for ループを通過すると
run()
、ユーザーが「 」を押したときにアップロードしていた写真がアップロードされますStop Uploading。ユーザーが「 」を押した瞬間に、現在の写真のアップロードを停止させたいと思いますStop Uploading。ありがとう。