我已经看过很多关于这个特殊问题的话题,但我仍然无法理解为什么我没有在主线程中捕获SIGINT。
这是我的代码:
def connect(self, retry=100):
tries=retry
logging.info('connecting to %s' % self.path)
while True:
try:
self.sp = serial.Serial(self.path, 115200)
self.pileMessage = pilemessage.Pilemessage()
self.pileData = pilemessage.Pilemessage()
self.reception = reception.Reception(self.sp,self.pileMessage,self.pileData)
self.reception.start()
self.collisionlistener = collisionListener.CollisionListener(self)
self.message = messageThread.Message(self.pileMessage,self.collisionlistener)
self.datastreaminglistener = dataStreamingListener.DataStreamingListener(self)
self.datastreaming = dataStreaming.Data(self.pileData,self.datastreaminglistener)
return
except serial.serialutil.SerialException:
logging.info('retrying')
if not retry:
raise SpheroError('failed to connect after %d tries' % (tries-retry))
retry -= 1
def disconnect(self):
self.reception.stop()
self.message.stop()
self.datastreaming.stop()
while not self.pileData.isEmpty():
self.pileData.pop()
self.datastreaminglistener.remove()
while not self.pileMessage.isEmpty():
self.pileMessage.pop()
self.collisionlistener.remove()
self.sp.close()
if __name__ == '__main__':
import time
try:
logging.getLogger().setLevel(logging.DEBUG)
s = Sphero("/dev/rfcomm0")
s.connect()
s.set_motion_timeout(65525)
s.set_rgb(0,255,0)
s.set_back_led_output(255)
s.configure_locator(0,0)
except KeyboardInterrupt:
s.disconnect()
在main函数中我调用Connect(),它启动我没有直接控制的线程。 当我启动这个脚本时,我希望能够在通过调用“disconnect()”函数来阻止所有其他线程时阻止它。
在我提供的代码中,它不起作用,因为main函数中没有线程。但是我已经尝试将Main()中的所有指令放在一个带有While循环的Thread中但没有成功。
有没有一种简单的方法可以解决我的问题?
感谢名单
答案 0 :(得分:1)
你的缩进搞砸了,但还有足够的时间继续下去。
你的主要帖子没有抓住SIGINT
因为它不活着。没有任何东西阻止你的主线程继续经过try
区块,看不到更多代码,并关闭商店。
我不熟悉Sphero
。我只是试图谷歌它的文档,并链接到一堆404页面,所以我告诉你在线程环境中你通常会做什么 - join
你的线程到主线程,所以主要线程无法在工作线程之前完成执行。
for t in my_thread_list:
t.join() #main thread can't get past here until all the threads finish
如果您的Sphero
对象没有提供join
功能,那么您可以破解该块中的内容,即
raw_input('Press Enter to disconnect')
s.disconnect()