无法在多线程程序中捕获SIGINT

时间:2014-03-11 16:40:47

标签: python

我已经看过很多关于这个特殊问题的话题,但我仍然无法理解为什么我没有在主线程中捕获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中但没有成功。

有没有一种简单的方法可以解决我的问题?

感谢名单

1 个答案:

答案 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()