On Jun 16, 2013, at 8:27 AM, Gary Willoughby <d...@kalekold.net> wrote:

> I'm writing a little program in D to perform some database operations and 
> have a small question about design.
> 
> Part of my program watches a log file for changes and this involves code 
> which is wrapped up in a class. So the usage is something like this:
> 
> auto fileWatcher = new FileWatcher(fileName);
> fileWatcher.onChange(delegate);
> fileWatcher.start();
> 
> Once the start method is called a loop is entered within the class and the 
> file is watched. Changes are handle through calling the registered delegate. 
> The loop uses different watch methods for different platforms.
> 
> What i need to be able to do is to stop the current watch and change the 
> watched file.
> 
> Because this is in an infinite loop, i can't check externally i.e. outside of 
> the class, if i need to break from the loop simply because control never 
> returns to the caller of the start() method.
> 
> Am i missing something simple here? Any advice is welcome. I thought about 
> threading and message passing but that's maybe overkill for something as 
> simple as this?

Some form of concurrency is probably what you want here.  But be aware that 
your delegate may have to be made thread-safe, depending on what it does.  
Regan suggested using Thread, and you can use spawn as well:


        import std.concurrency;
        import std.conv;
        import std.datetime;
        import std.stdio;
        import core.thread;


        void main()
        {
                auto tid = spawn(&fileWatcher, "file0");

                foreach (i; 1 .. 5)
                {
                        Thread.sleep(dur!"msecs"(300)); // sleep for a bit to 
simulate work
                        send(tid, "file" ~ to!string(i));
                }
        }


        void fileWatcher(string fileName)
        {
                while (true)
                {
                        receiveTimeout(dur!"msecs"(0),
                                                   (string n) => fileName = n);
                        writefln("checking %s", fileName);
                        Thread.sleep(dur!"msecs"(100)); // sleep for a bit to 
simulate work
                }
                writeln("bye!");
        }

Reply via email to