Python如何停止一个线程呢???我这种方法对不对啊???

Mr显 2012-06-21 11:43:51
我现在的方法如下:

线程定义如下:

#Transmit and Recive
class TrThread(Thread):
def run(self):
self.doRecv =True
while self.doRecv==True:
rbuf = COM.read(1) #read one, with timeout
if rbuf:
n = COM.inWaiting()
if n:
rbuf = rbuf+COM.read(n)
RQueue.put(rbuf)
root.event_generate("<<COMRxRdy>>",when='tail')

if TQueue:
COM.write(TQueue.get())
time.sleep(0.005)

def stop(self):
self.doRecv = False


在想要停止这个线程的地方做如下操作:

trcv=TrThread()
trcv.setDaemon(True)
...
...
...
trcv.stop()
trcv.join()


但是我发现程序会死在trcv.join()调用的地方,,,请问这是为什么呢???应该如何解决呢???
...全文
12379 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr显 2012-06-22
  • 打赏
  • 举报
回复
问题解决了,,,就是原来的代码就能工作,,,可能之前其他地方有问题,导致这段代码不工作了。。。


另外,发现Python的threading.Thread对象只能start一次,若想stop之后重新start只能重新生成一个对象,不如QThread方便啊。。。。
Mr显 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

你的线程有stop方法,setDaemon(True)和join()都可以免了吧...
[/Quote]

join()肯定不能省的,,,因为stop并不能让串口线程立即停止,,如果stop()调用之后立即COM.close(),就可能导致串口已经关闭了,可是串口线程却还在读,,,所以必须用join等待串口线程推出了再COM.close()

另外setDaemon(True)也不能省去,,,因为用户有可能没有关闭串口(也就是没有执行stop()函数)就直接关掉窗口程序,这样子的话主线程已经退出了,,可是串口线程还是在执行。。。

所以,两个都不能省去。。。
Mr显 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

你的线程有stop方法,setDaemon(True)和join()都可以免了吧...
[/Quote]

join()肯定不能省的,,,因为stop并不能让串口线程立即停止,,如果stop()调用之后立即COM.close(),就可能导致串口已经关闭了,可是串口线程却还在读,,,所以必须用join等待串口线程推出了再COM.close()

另外setDaemon(True)也不能省去,,,因为用户有可能没有关闭串口(也就是没有执行stop()函数)就直接关掉窗口程序,这样子的话主线程已经退出了,,可是串口线程还是在执行。。。

所以,两个都不能省去。。。
angel_su 2012-06-21
  • 打赏
  • 举报
回复
你的线程有stop方法,setDaemon(True)和join()都可以免了吧...
薛定谔之死猫 2012-06-21
  • 打赏
  • 举报
回复
这样就更直观了
from threading import *
import time

class MyThread(Thread):
def run (self):
self.ifdo = True;
while self.ifdo:
print 'I am running...'
time.sleep(2)

def stop (self):
print 'I am stopping it...'
self.ifdo = False;

tr = MyThread()
tr.setDaemon(True)
tr.start()
print 'I will stop it...'
time.sleep(5)
tr.stop()
tr.join()
薛定谔之死猫 2012-06-21
  • 打赏
  • 举报
回复
是不是等待串口数据导致线程自己sleep而没有机会执行,主线程的join没法继续,方法就是这样的,换成这个能执行
from threading import *
import time

class MyThread(Thread):
def run (self):
self.ifdo = True;
while self.ifdo:
print 'I am running...'
time.sleep(0.1)

def stop (self):
print 'I will stop it...'
self.ifdo = False;

tr = MyThread()
tr.setDaemon(True)
tr.start()
time.sleep(1)
tr.stop()
tr.join()

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧