編輯:此修訂/更新之前此問題的主要部分是如何終止QThread。這已經解決了,問題正在修改爲如何殺死正在進行的請求休息對象。如何殺死正在進行的請求請求對象
http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests 使用異步請求仍顯示出現 - 用戶無法在正在進行的過程中取消該帖子。
基本上,這是需要的功能: 當用戶按下停止上傳,上傳必須立即停止,我可以用停止(),但是它只是檢查停止線程是否應該停止一次循環已經重新結束了。
所以基本上,應該可以使用一個異步請求,讓我檢查它是否應該在請求期間被取消,但是,我不知道如何。
有什麼建議嗎?該帖子的前一部分仍然相關,因此在下面。
請注意,關於如何終止QThread的最初問題已經解決,因此下面的代碼不是太重要,只是針對上下文,現在我需要幫助的是我剛纔描述的。
我一直在寫一個程序,它的照片上傳,我做了一個線程 中,我上傳的文件。我不知道如何退出 線程。我已經嘗試了我從這裏閱讀的建議:
1)我已經試過了一個bool標誌,將其包裝在方法和 的聲明中。
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
這是IM如何調用它。
def upload(self): self.doneBox.clear() self.workThread = WorkThread() self.connect(self.workThread, QtCore.SIGNAL("update(QString)"), self.startUploading) self.workThread.start()
任何人都可以建議在一種方式,我可以快速終止線程 和安靜嗎?或者如果你認爲這不好,一種安全的方法。
但是,如果我不殺即刻它,它會通過在
run()
方法再次 循環,它會上傳照片,這是 上傳當用戶按下「停止上傳」。我 不希望它這樣做,我寧願把它停止上傳 當前照片的第二個用戶按下「停止上傳」。感謝。
哎呀,我不明白,我補充說,雖然和if語句的run()方法,再加上我告訴它打印「觸發」如果發生瞭如果沒有聲明,但事實並非如此。 http://pastebin.com/05pSxCjG 這裏是它的一個引擎收錄,我還在打電話用同樣的方式。 這就是我打電話給stop()的方式。 'def stopUploading(self): self.workThread = WorkThread() self.workThread.stop()' 你可以提出一個原因,它不工作? – Anteara 2012-02-22 07:46:53
這是你從正在啓動workThread的主線程調用的東西嗎?從您的pastebin示例中,您只檢查線程是否應該在循環遍歷文件系統之前退出一次。然後,一旦它完成整個目錄,它將重新開始並檢查它是否應該退出,然後再次遍歷該目錄。這是你想要的功能嗎?如果你想要的只是循環一次,刪除'while',並且每次都用'self._isRunning'檢查''file in file'。如果它仍然讓你困惑,那麼也許我們應該談一談? – jdi 2012-02-22 17:58:25
基本上,我不能讓它工作,我認爲談話會很好。 – Anteara 2012-02-24 09:08:12