3

2 つのプロセスが通信しています。最初のものはパイプまたは fifo にデータを書き込み (私は両方を試しました)、2 つ目はその内容を読み取ります。送信されるデータは現在、センサーから直接送られる 6 つのフロートであるため、頻繁にアップロードする必要があります (10Hz)。

問題は、データを読み取るプロセスがやや「重く」、十分な速さで読み取れない可能性があることです。パイプがいっぱいになり、プログラムの終了まで読み取りが遅れます。

このような遅延は許容できないため、書き込み部分でパイプがいっぱいかどうかを検出できます (その場合、間違っていれば訂正してください。データを書き込むのに十分なスペースができるまで待ちます)。このような検出が可能な場合、パイプの内容をクリアして、読み取り部分がすぐに最近のデータを受け取り、古いスタッドでいっぱいのパイプ全体を通過する必要がないようにするにはどうすればよいですか?

要するに、データのパイプを空にする方法はありますか (閉じて再度開く必要がないことはプラスになります)。

どうもありがとう、

4

1 に答える 1

0

これにより、パイプがいっぱいになる頻度は減りますが、なくならないわけではありません。

パラダイムの変更:読み取りのパーセンテージを破棄するリーダーを調整します。

ライター ライター
が満杯のキューを確認すると、次に書き込む数値は特殊な数値 (NaN など) であり、次に目的の数値を書き込みます。

リーダー
リーダーは、数値の P パーセントを破棄するように設定されています。

リーダーは数字を読み取ります - 必要に応じて待機します。捨てる候補でない場合は通常通り。

リーダーがその廃棄パーセンテージを満たすために数値を廃棄することを検討する場合、最初にパイプが空かどうかをテストします。その場合、リーダーは捨てられる割合を減らす必要があることを認識し、最初に読み取った数値を使用します。パイプが空でない場合は、パイプを読み取り、最初の数値を破棄して 2 番目の数値を使用します。

リーダーが特別な番号を読み取ると、十分な数を捨てていないことがわかり、そのパーセンテージを増やしてから、パイプを再度読み取ります。

リーダー側とライター側の全体的なパフォーマンスがあまり変わらない場合、リーダーは、迅速なライターとゆっくりとしたリーダーのパフォーマンスのバランスを取りながら、頻繁に 1 つの数値を破棄します。満杯のキューよりも空のキューが優先されるわずかなゆがみがある場合、パイプがいっぱいになることはめったになく、リーダーはより頻繁に新しい番号を受け取ります。

于 2013-06-07T19:23:53.673 に答える