1

私は大気質ステーションを表す 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()

このコードに関する 2 つの問題/質問があります。

  1. AirStation クラスの初期化関数で緯度と経度の読み取りを確実にする最善の方法は何ですか? 初期化時に、緯度と経度の値が None になっています (GPS が衛星を修正するのに時間がかからなかったと思われます)。

  2. GpsPoller が AirStation インスタンスと共に確実に終了されるようにする標準的な方法は何ですか? コマンドラインでこれをテストするとexit()、追加のスレッドがハングするため、コマンドがハングします。


以下を含むかなりの数の例とドキュメントを見てきました。

追加のリソースや直接の回答をいただければ幸いです。

4

2 に答える 2

1
  1. GpsPoller クラスで使用しているように見える gps モジュールと、そのモジュールでのポーリングをサポートしているかどうかについてはよくわかりません (fileno 属性の存在を確認してください)。ただし、そうでないと仮定すると、私が提供できる最善の方法は、値が設定されるまでビジーウェイトすることです

何かのようなもの:

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. スレッドが親プロセスで終了することを確実にする最良の方法は、既に行ったことを実行し、ブール値を False に設定できるメイン ループに関連付けて、スレッドが終了するはずのときにループを中断することです。あなたが見逃していると思うのは、AirStation クラスが閉じたときに GpsPollers の running 属性を False に設定するための呼び出しです。
于 2015-10-10T19:03:04.777 に答える