FLTK logo

Documentation

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 Home  |  Articles & FAQs  |  Bugs & Features  |  Documentation  |  Download  ]
 

10 - Advanced FLTK

This chapter explains advanced programming and design topics that will help you to get the most out of FLTK.

Multithreading

FLTK supports multithreaded application using a locking mechanism based on "pthreads". We do not provide a threading interface as part of the library. However a simple example how threads can be implemented for all supported platforms can be found in test/threads.h and test/threads.cxx.

To use the locking mechanism, FLTK must be compiled with --enable-threads set during the configure process. IDE-based versions of FLTK are automatically compiled with locking enabled if possible.

In main(), call Fl::lock() before Fl::run() or Fl::wait() to start the runtime multithreading support for your program. All callbacks and derived functions like handle() and draw() will now be properly locked:

    int main() {
      Fl::lock();
      /* run thread */
      while (Fl::wait() > 0) {
        if (Fl::thread_message()) {
          /* process your data */
        }
      }
    }

You can now start as many threads as you like. From within a thread (other than the main thread) FLTK calls must be wrapped with calls to Fl::lock() and Fl::unlock():

    Fl::lock();      // avoid conflicting calls
    ...              // your code here
    Fl::unlock();    // allow other threads to access FLTK again

You can send messages from child threads to the main thread using Fl::awake(msg):

    void *msg;       // "msg" is a pointer to your message
    Fl::awake(msg);  // send "msg" to main thread

You can also tell the main thread to call a function for you as soon as possible by using Fl::awake(callback, userdata):

    void do_something(void *userdata) {
      // running with the main thread
    }

    // running in another thread
    void *data;       // "data" is a pointer to your user data
    Fl::awake(do_something, data);  // call something in main thread

FLTK supports multiple platforms, some of them which do not allow any other but the main thread to handle system events and open or close windows. The safe thing to do is to adhere to the following rules for threads on all operating systems:

  • Don't show() or hide()anything that contains widgets derived from Fl_Window, including dialogs, file choosers, subwindows or Fl_GL_Windows
  • Don't call Fl::wait(), Fl::flush() or any related methods that will handle system messages
  • Don't start or cancel timers
  • Don't change window decorations or titles
  • The make_current() method may or may not work well for regular windows, but should always work for Fl_GL_Windows to allow for high speed rendering on graphics cards with multiple pipelines

See also: void awake(void *message), void lock(), void *thread_message(), void unlock().


User Comments [ Add Comment ]

No comments for this page.

 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.