Async read an output stream but how many bytes ?

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Mar 30 17:50:16 PDT 2016


Hey, I have a class that wraps a process and implements two 
events. One of them is called after poll() for example if new 
data are available.

The event is called correctly but I don't know how exactly how to 
read the data:

- per buffer of fixed size ?
- using the stream information ?

If i try to read until nothing is available anymore, the event 
handler returns at the end of the process (instead of being 
called several times): eg this helper function of the process 
that the event handler can call to read:


     bool readOutput(T)(ref T t)
     if (isSomeString!T)
     {
         bool result;
         T buffer;
         while (true) // or (!output.eof)
         {
             auto cnt = output.readln(buffer);
             if (cnt)
             {
                 t ~= buffer;
                 result = true;
             }
             else break;
         }
         return result;
     }


the events are called in the callback of a thread-based timer:


     void check(Object notifier)
     {
         if (_ppid.stdout.eof)
         {
             _checker.stop; // the thrad-based timer
             if(_onTerminate)
                 _onTerminate(this);
         }
         else
         {
             // not sure if something else must be done to poll 
properly ?
	    pollfd pfd = { _ppid.stdout.fileno, POLLIN };
	    if (poll(&pfd, 1, 0) == 1 && _onOutputBuffer)
                 _onOutputBuffer(this); // the handler can call 
readOutput
         }
     }

There should be a way to know how many bytes are available ?


More information about the Digitalmars-d-learn mailing list