我正在开发一个代表空气质量站的python类。每个空气质量站都有一个与之相关的GPS,以便我们可以识别该站的纬度和纵向坐标。 GpsPoller在单独的线程上调用并持续运行,直到线程终止。应该使用GpsPoller在任何给定时间获取最新的GPS数据。
这是我到目前为止所做的事情:
class AirStation:
def __init__(self):
if not self._init_station():
raise InitException("Could not initialize the AirStation!")
def _init_station(self):
self._id = utils.get_mac('wlan0')
self._gpsp = utils.GpsPoller()
self._gpsp.start() # start polling the GPS sensor
self._lat = self._gpsp.get_gps_data()
self._lon = self._gpsp.get_gps_data()
return True
class GpsPoller(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.session = gps(mode=WATCH_ENABLE)
self.current_value = None
self.running = True
def get_gps_data(self):
return self.current_value
def run(self):
while self.running:
self.current_value = self.session.next()
我对此代码有两个问题/疑问:
确保AirStation类初始化功能中的纬度和纵向读数的最佳方法是什么?在初始化时,我得到的纬度和纵向值为无(我怀疑GPS由于没有时间来进行卫星定位)。
确保GpsPoller与AirStation实例一起终止的标准方法是什么?每当我在命令行测试时,exit()
命令都会挂起,因为其他线程会挂起。
我已经看了很多例子和文档,包括以下内容:
非常感谢任何其他资源或直接答案!
答案 0 :(得分:1)
类似的东西:
while True:
if self._lat is None:
self._lat = self._gpsp.get_gps_data()
elif self._lon is None:
self._lon = self._gpsp.get_gps_data()
else:
break
答案 1 :(得分:0)
我相信我找到了上面发布的问题的最佳解决方案。以下是我的想法:
GPS模块需要足够的时间来修复卫星。没有办法加快这个过程(至少为了这个应用程序)。从我的实验看来,我使用的GPS模块在大约4-5秒内始终返回所有GPS修复。
要回答我的第一个问题,确保在AirStation对象初始化中获得纬度和纵向坐标的最佳方法是在启动GpsPoller后等待几秒钟。
确保GpsPoller线程终止的最佳方法是通过在父进程中设置self._gpsp.running = False然后等待线程与父线程联接备份来终止循环条件使用self._gpsp.join()。
可以将这些操作放入 close()方法中,该方法应在工作站对象生命周期结束时调用。