更新:我发现了这个错误。停止线程时,应关闭在listner中打开的串口。我不这样做。
我有一个简单的python程序,在它的主要部分,它通过调用它们的start()
函数启动2个线程。当用户按下某个特定的键时,程序会清除这两个线程每次检查的条件self.is_running=false
,因此它们会在错误时终止:
def run(self):
...
while self.is_running:
...
return
问题是我看到线程终止,但程序永远不会返回到命令提示符,并且没有组合键ctrl+x
等会使它返回到命令提示符。如果我想使用终端控制台,我必须手动关闭控制台窗口并重新启动一个新窗口。我甚至在线程终止后使用sys.exit()
但仍然没有区别。
你知道我哪里出错吗?
这是最小的代码:
main.py:
def main():
listner_thread = None
try:
listner_thread = listner.listner()
listner_thread.start();
except:
Message = "Listener Thread Failed To Start"
print (Message)
return
ui_thread=None
try:
ui_thread = ui.ui(listner_thread)
ui_thread.start();
except:
Message = "UI Thread Failed To Start"
print (Message)
return
return
if __name__ == '__main__':
main()
listener.py和ui.py threads:
class listner(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.port=serial.serial('COM11',115200)
def run(self):
...
while self.is_running:
self.port.read(1)
return
指示终止线程的是ui线程:
ui.py
class ui(threading.Thread):
def __init__(self,listner):
threading.Thread.__init__(self)
self.listner=listner
def run(self):
Message = ('\n Starting Thread (' + self.name + ')\n')
print Message
self.running = True
while self.running:
user = raw_input('\n Q- Quit\n')
if user.isalpha() and user.upper() == 'Q':
self.listner.is_running= False
self.running = False
return
答案 0 :(得分:1)
您在UI线程实例上将running
设置为False
,但绝不会在侦听器线程实例上改变running
。因此,您的侦听器线程将永远不会退出。
尝试将退出条件提升为全局,例如should_exit = False
。然后,UI线程可以设置此True
,并且由于全局范围是跨线程共享的,因此两者都应该看到更改。
答案 1 :(得分:0)
在监听器中我打开了一个串口。在线程终止时没有关闭(port.close()
)设置' is_running = False' ,当我添加port.close()
时,它正确地退出了线程。