You are aware though that in your timer, the callback is executed from within a different thread. You could let the timer thread send messages as clock ticks and wait on them, that way risking less issues
with implicit sharing.

Martin

----

import std.concurrency, std.stdio;
import core.thread;

struct Timer {
    private Tid clock;
    private bool running;
    enum Terminate { _ };
    enum Ping { _ };

    ~this() {
        stop();
    }

    void start(Duration duration) {
        avoidMailboxSpam();
        stop();
        clock = spawnLinked(&runClock, thisTid, duration);
        running = true;
    }

    void stop() {
        if (running)
            clock.send(Terminate._);
        running = false;
    }

    void wait() {
        receiveOnly!Ping();
    }

    private static void avoidMailboxSpam() {
        setMaxMailboxSize(thisTid, 5, OnCrowding.throwException);
    }

    private static void runClock(Tid tick, Duration duration) {
        bool cont = true;
        size_t cnt;
        try {
            while (cont) {
                auto timedOut = !receiveTimeout(
                    duration,
                    (Terminate) { cont = false; },
                );
                if (timedOut) {
                    writefln("  #%-5d   Ping  ", cnt++);
                    tick.send(Ping._);
                }
            }
        } catch (Exception ex) {
            stderr.writeln(ex.msg);
            throw ex;
        }
    }
}

void main() {
    Timer timer;
    auto interval = dur!"msecs"(500);
    timer.start(interval);

    foreach(cnt; 0 .. 200) {
        timer.wait();

        // Play some pong, if it takes too long our mailbox gets flooded
        Thread.sleep(interval / 2);
        writefln("  Pong     #%-5d", cnt);
    }
    timer.stop();
}


On Wed, 20 Jul 2011 09:34:39 +0200, maarten van damme <maartenvd1...@gmail.com> wrote:

Thanks but it seems way more complex then I need, I tried writing my own but
I get an acces violation error. here is my try :
http://dl.dropbox.com/u/15024434/Timer.d . Can someone spot the error? keep
in mind I don't really understand the threading model and pointers.


2011/7/19 Piotr Szturmaj <bncr...@jadamspam.pl>

maarten van damme wrote:

<snip>

There is no callback timer in Phobos. But here's my implementation of timer
wheel I used in one of my projects: http://pastebin.com/dRRZtPVW. Feel
free to use it if you want.



Reply via email to