编辑:此修订/更新之前此问题的主要部分是如何终止QThread。这已经解决了,问题正在修改为如何杀死正在进行的请求休息对象。
http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests 它似乎使用异步请求仍然阻止 - 用户无法取消正在进行的帖子。
基本上这是所需的功能: 当用户按停止上传时,上传必须立即停止,我可以使用stop()停止线程,但是只检查一旦循环再次循环,它是否应该停止。
所以基本上,应该可以使用异步请求,让我检查是否应该在请求期间取消它,但是,我不知道如何。
有什么建议吗?帖子的前一部分仍然相关,所以它在下面。
请注意,关于如何终止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
这是我怎么称呼它。
def upload(self): self.doneBox.clear() self.workThread = WorkThread() self.connect( self.workThread, QtCore.SIGNAL("update(QString)"), self.startUploading ) self.workThread.start()
任何人都可以建议我可以快速终止线程 而且安静地?或者,如果你认为这不好,就可以安全地阻止它。
但是,如果我不立即杀死它,它会通过for 再次循环
run()
方法,它会上传它的照片 当用户按下“停止上传”时上传。一世 我不希望它这样做,我宁愿让它停止上传 用户按下“停止上传”的第二张当前照片。感谢。
答案 0 :(得分: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()
当文档提到清理时,他们正在谈论关闭您可能已经打开的资源,撤消可能部分启动的内容,或者您可能想要发出的任何信号或处理的其他内容杀死线程对象。对于上传器,您希望在开始每个上载过程之前检查线程是否应该退出。这将使您有机会停止该线程,并在继续进行其他工作之前将其退出。
答案 1 :(得分:0)
尝试终止它:
self.workThread.terminate()
这样做时要小心。由于您正在执行网络操作,因此无法阻止它,但通常执行此操作:
# Logic...
if self.running:
# Continue logic...
您可以从主题外部设置self.running
。