2013-07-08 39 views
1

我在停止正在執行阻塞操作的線程時遇到問題。我書面方式使用通用產品安全指令的程序和它的Python綁定,該線程的run方法是這樣的:停止運行阻塞操作的線程

def run(self): 
    print "inside run. outside while" 
    global gpsd 
    while self.running: 
     print "inside while" 
     try: 
      print "before next()" 
      gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer 
      print "after next()" 
      self.file_descriptor.write(str(int(time.time())) + ',' + str(gpsd.fix.latitude) + ',' + str(gpsd.fix.longitude) + ',' + str(gpsd.fix.altitude) + ',' + str(gpsd.fix.speed) + '\n') 
      print "after write" 
      #self.file_descriptor.write("self.running" + str(self.running) + '\n') 
      self.file_descriptor.flush() 
      print "after flush" 
      time.sleep(5) 
      print "after sleep" 
     except: 
      print "inside thread except" 
      raise 

問題是,下一個()方法被阻塞,因此,即使從我的主線程我打電話:

print "Stopping GPS thread" 
    gpsp.running = False 
    gpsp.join() # wait for the thread to finish what it's doing 

當沒有GPS修復運行方法在next()上被阻止不會停止自己......任何想法?如果GPS已經修復,代碼工作正常。

非常感謝!

回答

3

好吧,我想我做到了。 GPS庫有一個非阻塞的方法來檢查數據是否可用,所以現在它看起來像:

def run(self): 
    global gpsd 
    while self.running: 
     try: 
      if gpsd.waiting(): #only True if data is available 
       gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer 

      self.file_descriptor.write(str(int(time.time())) + ',' + str(gpsd.fix.latitude) + ',' + str(gpsd.fix.longitude) + ',' + str(gpsd.fix.altitude) + ',' + str(gpsd.fix.speed) + '\n') 
      self.file_descriptor.flush() 
      time.sleep(5) 
     except: 
      raise 

它的工作正常。謝謝!

+0

非常感謝。我想要一個與gpsd utc時間相比系統時間(python的日期時間)的tkinter時鐘,而且我真的希望保持系統時間以毫秒爲單位。我不想弄清楚如何使用Python線程,因爲我對Python很陌生(而且我一般使用的線程很少),這真的救了我。 +1,如果我可以的話。 – dylnmc

0

我知道這不是很優雅,但這是我到目前爲止的代碼,似乎工作正常。以防萬一對任何人都有用。

它從gpsd讀取GPS位置並每隔5秒將其寫入一個文件。

while self.running: 
       try: 
        if gpsd.waiting(): 
         #print "inside waiting()" 
         while gpsd.waiting(): 
          gpsd.next()   

         self.file_descriptor.write(str(int(time.time())) + ',' 
                + str(gpsd.fix.latitude) + ',' 
                + str(gpsd.fix.longitude) + ',' 
                + str(gpsd.fix.altitude) + ',' 
                + str(gpsd.fix.speed) + '\n') 
         self.clear_fix()     
        else:      
         self.file_descriptor.write(str(int(time.time())) + ",NO_GPS_FIX\n") 

        self.file_descriptor.flush() 
        time.sleep(5) 
       except: 
        print "Exception on run()inside thread" 
        raise