としてFIFOファイルを開きますifstream
。オブジェクトが作成されるとすぐに、FIFO に何かを送信するまでスレッドはブロックされます (これは私にとっては問題ありません)。getline()
次に、ストリームからデータを取得するために呼び出します。
より多くのデータが FIFO ファイルに書き込まれるまで、スレッドを再度読み取りブロックするにはどうすればよいですか?
ありがとう
としてFIFOファイルを開きますifstream
。オブジェクトが作成されるとすぐに、FIFO に何かを送信するまでスレッドはブロックされます (これは私にとっては問題ありません)。getline()
次に、ストリームからデータを取得するために呼び出します。
より多くのデータが FIFO ファイルに書き込まれるまで、スレッドを再度読み取りブロックするにはどうすればよいですか?
ありがとう
私はこのコードをテストしていませんが、利用可能なすべてのデータを読み取るときに、FIFO が単に EOF ビットを設定しているのかどうか疑問に思っています。その場合、これを行うことができる場合があります。
std::ifstream fifo;
std::string line;
bool done = false;
/* code to open your FIFO */
while (!done)
{
while (std::getline(fifo, line))
{
/* do stuff with line */
}
if (fifo.eof())
{
fifo.clear(); // Clear the EOF bit to enable further reading
}
else
{
done = true;
}
}
FIFO の終わりを読み取った場合は、リセットして次のデータを待ちます。エラーが発生した場合は、完了です。私はこのウェブサイトからこれのアイデアを得ました。リセットを実行した同じブロックで FIFO を閉じて再度開く必要がある場合もあります。
によって提供されるgetline
関数は<string>
、ストリームオブジェクトへの参照を返します。このオブジェクトの「良さ」をテストして、まだ開いているかどうか、またはエラーが発生したかどうかを確認できます。
std::ifstream fifo;
std::string line;
/* code to open your FIFO */
while (std::getline(fifo, line))
{
/* do stuff with line */
}
FIFOが閉じると、whileテストはfalseを返し、ループを終了します。すべてのループ反復は、より多くのデータが準備できるまで、スレッドを効果的に読み取りブロックします。
次のようにストリームを使用します。
ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);
string CmdLine;
while (std::getline(_FifoInStream, CmdLine)) {
cout << CmdLine << endl;
}
_FifoInStream 変数を初期化するとき、つまりストリームを開くときにのみブロックされます。データを FIFO に送信した後、while ブロックを通り抜けます。私が必要とするのは、読み取り時にブロックされるたびに FIFO から無期限に読み取ることです。