On Tuesday, 30 June 2020 at 08:15:54 UTC, aberba wrote:
On Tuesday, 30 June 2020 at 00:33:41 UTC, Ali Çehreli wrote:
On 6/29/20 4:34 PM, aberba wrote:
> So with this, without the Thread.sleep() to block main from
exiting, the
> spawned thread will terminate immediately.
You can call core.thread.thread_joinAll at the end of main.
So I tried that initially but my (){ writeln(...) } wasn't
printing anything in console. Could that be related to stdout
buffering? The program kept running though.
Seems weird. This works great on my machine:
import core.time : Duration, msecs;
import core.thread : Thread, thread_joinAll;
import std.concurrency : spawn, Tid, send, receiveTimeout;
import std.stdio : writeln;
private struct IntervalStop {}
Tid setInterval(Duration dur, void function() fn) {
return spawn((Duration d, void function() f){
while (!receiveTimeout(d, (IntervalStop s){})) {
f();
}
}, dur, fn);
}
void stopInterval(Tid tid) {
tid.send(IntervalStop());
}
void main() {
auto a = setInterval(1000.msecs, (){ writeln("Hello from
spawned thread A"); });
// Stop it before it happens
stopInterval(a);
Thread.sleep(2000.msecs);
auto b = setInterval(1000.msecs, (){ writeln("Hello from
spawned thread B"); });
// Let this one run a little
Thread.sleep(2500.msecs);
stopInterval(b);
auto c = setInterval(1000.msecs, (){ writeln("Hello from
spawned thread C"); });
// Sending the wrong message doesn't make it happen or stop
prematurely
c.send("Stop this at once!");
Thread.sleep(2500.msecs);
stopInterval(c);
thread_joinAll();
}
So I guess the error is elsewhere, but I'm not sure where and how.
--
Simen