On 07.05.20 02:13, Daren Scot Wilson wrote:
import std.stdio;
import core.stdc.stdio;  // for getchar().  There's nothing similar in D std libs?
import std.concurrency;
import core.thread; // just for sleep()

Instead of the comment you can write:

    import core.thread: sleep;

bool running=true;
char command = '?';

These variables are thread-local by default. That means independent `running` and `command` variables are created for every thread. If you make changes in one thread, they won't be visible in another thread.

Use `shared` so that all threads use the same variables:

    shared bool running=true;
    shared char command = '?';

void cmdwatcher()
{
     writeln("Key Watcher");
     while (running)  {
         char c = cast(char)getchar();
         if (c>=' ')  {
             command = c;
             writefln("     key %c  %04X", c, c);
         }
     }
}

void main()
{
     writeln("Start main");
     spawn(&cmdwatcher);

     while (running) {
         writeln("Repetitive work");
         Thread.sleep( dur!("msecs")( 900 ) );

        char cmd = command;  // local copy can't change during rest of this loop

For values that don't change, we've got `immutable`:

    immutable char cmd = command;

         command = ' ';

Note that even when using `shared` you still have to think hard to avoid race conditions.

This sequence of events is entirely possible:

    1) main: cmd = command
    2) cmdwatcher: command = c
    3) main: command = ' '

It won't happen often, but if it does, your input has no effect.

Reply via email to