4

編集:このリビジョン/更新前のこの質問の主な部分は、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

ありがとう。

4

2 に答える 2

1

あなたがglobal w; w = WorkThreadそれで何をしているのかわかりませんが、あなたはそれで何もしていないので無意味に思えます.

あなた__init__()はフラグが欲しい:

def __init__(self):
    ...
    self._isRunning = False

メソッドでは、run()このフラグをチェックして、必要に応じて終了します。

def run(self):
    self._isRunning = True
    while True:
        if not self._isRunning:
            # clean up or close anything here
            return
        # do rest of work

そして、単純な便利なメソッドを追加するかもしれません:

def stop(self):
    self._isRunning = False
    self.wait()

ドキュメンテーションがクリーンアップに言及する場合、開いた可能性のあるリソースを閉じること、部分的に開始された可能性のあるものを元に戻すこと、またはスレッドオブジェクトを強制終了する前にシグナルまたは処理したいその他のことについて話している. アップローダの場合、各アップロード プロセスを開始する前に、スレッドを終了する必要があるかどうかを確認する必要があります。これにより、スレッドを停止して、別の作業を続行する前に終了させることができます。

于 2012-02-22T06:39:16.423 に答える
0

終了してみてください:

self.workThread.terminate()

これを行うときは注意してください。ネットワーク操作を実行しているため、停止することはできませんが、通常は次のようにします。

# Logic...

if self.running:
  # Continue logic...

self.runningスレッドの外側から設定します。

于 2012-02-22T05:17:00.990 に答える