jdtoronto has asked for the wisdom of the Perl Monks concerning the following question:

Esteemed monks,

As my Win32/Perl/Tk monster continues to grow I find I have as many as FOUR POP3 servers being checked periodically by the programme. On top of this I am checking Skype for incoming calls and a PSTN modem for caller-ID information. So my poor little main event loop is getting somewhat bogged down - particularly as the POP3 processes are all blocking. So I figure I need to shed some load.

After reading through the monastery and searching the Web it would seem that named pipes through Win32::Pipe would be the most reliable way to go to allow the children to tell mama what is happening (usually - we have read emails and added records to the database, please update your action tables).

Apart form teh amterial in Dave Roth's book (WIN32 Perl Programming) does anyone know of useful tutorials or sample code anywhere?

As always, any suggestions would be appreciated

jdtoronto

Replies are listed 'Best First'.
Re: Named pipes on Win32
by ikegami (Patriarch) on Jun 15, 2006 at 15:36 UTC

    If there is indeed a child-parent relationship, there's no need for the pipes to be named. IPC::Open2 or IPC::Run spawns the child and provides unnamed pipes to it. (The child access the pipes as STDIN and STDOUT.) Using that module saves you the trouble of doing your own forking and of opening your own pipes.

    That said, you can't use select on pipes in Windows, so pipes are quite useless. Without select (or threads), the parent could block waiting on one child while another child wishes to speak to the parent, or the parent could block waiting for output from a child while the child is waiting for input from the parent.

    I recommend sockets instead. Using 'select' to handle multiple sockets provides an event loop, but I don't know how to integrate into Tk's event loop (having no Tk experience whatsoever).

      I would have thought that the blocking issue would be resolved by the PARENT using the peek() method to see if there is something to get from the pipe?

      Sockets have, sadly, become pretty useless in Win32 environments these days - certianly in end user ones. A selection of totally brain dead Windows firewall and security software interferes with sockets unmercifully. Anyone using a socket must be a hacker with ill intent after all, mustn't they?

      Integrating into the Tk event loop isn't rocket science, the process is well documented.

      jdtoronto

        You can also use Peek() on anonymous pipes, though you will need to access the underlying API PeekNamePipe() via Win32::API. Just pass the anonymous pipe handle in place of the named pipe handle and it works fine.

        It would not be a huge problem to use this to allow select work with anonymous pipes on Win32. It would just require someone who is prepared to jump through the p5p hoops to go in and implement it.

        My own experience of attempting to use Win32::Pipe has been less than satisfactory, mostly because of the limited set of the NamedPipe API set that it supports. I found it easier to use Win32::API to gain access to the underlying API's.


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: Named pipes on Win32
by Solo (Deacon) on Jun 15, 2006 at 17:44 UTC
    At the risk of sounding like a broken-record, POE. POE, POE, POE! If on the other hand, you are committed to Windows pipes, there can be no better reference than Mark Russinovich.

    --Solo

    --
    You said you wanted to be around when I made a mistake; well, this could be it, sweetheart.
      OK, OK, OK! POE, I get it!

      Two major questions, how do I integrate POE's event loop with that of Tk?

      A 'child' needs to 'die' through an error or some such, the whole thing goes down? A bit severe?

      I will go read the Sysinternals stuff, thanks for the pointer.

      jdtoronto

        There is a POE Cookbook recipe that demostrates how easy Tk integration should be. (Each link in my earlier post is actually to a different page with examples. Please forgive the unintended obfu.)

        Update:Child deaths are handled by the framework, again, see the examples and sigchld FAQ.

        Update:Corrected the cookbook link above. Thanks, Hue-Bond.

        --Solo

        --
        You said you wanted to be around when I made a mistake; well, this could be it, sweetheart.