How to implement Canceleable spawn() from parent

Johann Lermer johann.lermer at elvin.eu
Mon Jun 29 06:11:14 UTC 2020


I'm doing this in an X11 application in order to send a timer 
event every 100 milliseconds to the main event queue.

class Application
{
   shared private bool s_tick;

   void clock_task (shared X11.Display* disp, X11.Atom atom, 
X11.Window win)
   {
     for (;;)
     {
       try
       {
         receiveTimeout (100.msecs);

         if (disp && atomicLoad(s_tick))
         {
           // disable ticking until it is allowed again at the end 
of the event loop
           atomicStore(s_tick, false);

           X11.XClientMessageEvent event;
           event.type         = X11.ClientMessage;
           event.window       = win;
           event.message_type = atom;
           event.format       = 32;
           event.data.l       = [0, 0, 0, 0, 0];

           X11.XSendEvent (cast (X11.Display*) disp, win, 0, 0,  
cast(X11.XEvent*)&event);
           X11.XFlush (cast (X11.Display*) disp);
         }
       }
       catch (Throwable)
       {
         return;
       }
     }
   }

   this ()
   {
...
     spawn (&clock_task, cast(shared)x11Display, x11SigClockAtom, 
_x11_proxyWindow);
   }

   run ()
   {
     while (true)
     {
...
       // event processing starts here: read in X11 event and 
convert it to a wit Event
       X11.XEvent x11_event;
       X11.XNextEvent (_x11.display, &x11_event);
...
       atomicStore(s_tick, true);
     }
   }
}


More information about the Digitalmars-d-learn mailing list