On 18.03.2013 10:51, memoryl...@tin.it wrote: > Hi all, > just to have confirmation of what I am doing. > My app is multithreaded ; the main() loop and some other working threads, > receiving / sending data and doing calculations. > > The question: what is the correct way to fire a graphics update from a thread > ? > > My work (omitted all sanity checks): > > - main: > ..... > static int fd_refresh[2]; > ..... > pipe(fd_refresh); > SetNonblocking(fd_refresh[0]); > SetNonblocking(fd_refresh[1]); > Fl::add_fd(fd_refresh[0], Do_refresh_callback, NULL); > ..... > #define CMD_REFRESH 0 > ..... > static void Do_refresh_callback(int fd, void *data) > { > unsigned int val; > while(read(fd, &val, sizeof(val)) > 0) > { > switch(val) > { > case CMD_REFRESH: > // HERE I can draw to screen !
<nitpick on> To be precise: no, you can't! </nitpick> You can do widget updates and call redraw(), but you must not call draw() methods directly from a callback. See also below. > break; > ..... > } > } > ..... > } > > - A thread receives data and wants to update a drawing. It cannot do it > directly, > so it writes to fd_refresh[1] an integer which values represent what I want > to do > (full redraw(), partial updates, etc.) . > Fltk then will call Do_refresh_callback and there I will be safe drawing > anything. > > Is this sequence correct ? > Now it's working without (apparent) problems. AFAICT this is okay, so long as you don't call draw() directly, as I wrote above. However, using Fl::add_fd() with a pipe is not portable. IIRC you're using an embedded Linux platform, so this may not be a problem for you. But there are maybe more simple and portable ways using Fl::lock() and Fl::awake() to send messages from a thread to the FLTK main loop to do what you need. You can read more about this in the chapter "Advanced FLTK" in the docs. http://www.fltk.org/doc-1.3/advanced.html Others will probably chime in and tell you more about programming with threads and FLTK. Albrecht _______________________________________________ fltk mailing list fltk@easysw.com http://lists.easysw.com/mailman/listinfo/fltk