Question

J'ouvre un fichier FIFO en tant que ifstream. Dès que l'objet est créé, le thread est bloqué jusqu'à ce que j'envoie quelque chose dans la FIFO (ce qui me convient). J'appelle ensuite getline() pour obtenir les données du flux.

Comment puis-je bloquer à nouveau le fil jusqu'à ce que davantage de données soient écrites dans le fichier FIFO?

Merci

Était-ce utile?

La solution

Je n'ai pas testé ce code, mais je me demande si la FIFO est simplement en train d'activer le bit EOF lorsque vous lisez toutes les données disponibles. Dans ce cas, vous pourrez peut-être faire ceci:

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;
    }
}

Si vous lisez la fin de la FIFO, réinitialisez et attendez d'autres données. Si une erreur est survenue, vous avez terminé. J'ai eu cette idée en ce site web . Vous devrez peut-être également fermer et rouvrir la FIFO dans le même bloc que celui où vous effectuez la réinitialisation.

Autres conseils

La fonction getline fournie par <string> renvoie une référence à l'objet flux. Vous pouvez tester cet objet pour & Quot; bonté & Quot; pour voir si elle est toujours ouverte ou si une erreur s'est produite:

std::ifstream fifo;
std::string   line;

/* code to open your FIFO */

while (std::getline(fifo, line))
{
    /* do stuff with line */
}

Lorsque la FIFO se ferme, le test while retournera false pour sortir de la boucle. Chaque itération de boucle lira efficacement le thread jusqu'à ce que plus de données soient prêtes.

J'utilise le flux comme suit:

ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);

string CmdLine;

while (std::getline(_FifoInStream, CmdLine)) {
    cout << CmdLine << endl;
}

Je ne suis bloqué que lorsque j'initialise la variable _FifoInStream, c'est-à-dire que j'ouvre le flux. Après avoir envoyé des données dans la FIFO, je tombe dans le bloc while. Ce dont j'ai besoin, c’est de lire indéfiniment dans FIFO à chaque blocage en lecture.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top