2013-09-14 6 views
-1

В настоящее время я работаю над визуализатором звукового сигнала. После получения сигнала мне нужно отобразить как его форму волны, так и спектр на двух разных окнах. Таким образом, я применил класс Plotter, который создает собственный поток для каждого экземпляра при его создании. Но теперь я столкнулся с проблемами, потому что многие из функций FLTK, казалось, были небезопасными по потоку, потому что он сбой при вызове метода класса. (Такие, как установить ось шкалы)Могу ли я создавать окна на разных потоках с помощью FLTK 1.3?

модель я использую сейчас:

Plotter 1 -> ctor() -> create thread 
            \ 
Plotter 2 -> ctor() -> create thread----> PlotterThread(Plotter*this) - 
            /        | 
Plotter 3 -> ctor() -> create thread         | 
                     | 
                create fltk window and init object 

Является ли эта модель даже практически? Я понятия не имею ... Спасибо.

ответ

1

Вы, очевидно, не читали самую важную часть документации FLTK относительно параллельного программирования: http://www.fltk.org/doc-1.3/advanced.html#advanced_multithreading. Пожалуйста, внимательно прочитайте его.

У вас есть два варианта:

  1. Fl::awake() Используйте для отправки сообщения на основной (GUI) потока. Основной поток может проверить сообщение с помощью Fl::thread_message() и создать любой виджет, который вам нравится.

  2. Между звонками до Fl::lock() и Fl::unlock() вызывать методы FLTK.

Наконец, у вас есть очень хороший демо в/тестовой директории $ FLTK_SRC, где $ FLTK_SRC является каталогом, в котором вы держите FLTK дерева исходного кода. Если у вас его нет, загрузите его.

0

я выработала решение этой проблемы:

Создать только один поток (плоттер нить) для всех плоттеров. Для плоттеров после первого они используют QueueUserAPC для публикации вызова конструкции для потока плоттера, потому что, кажется, FLTK позволяет создавать элементы пользовательского интерфейса в основном потоке. (Плоттер нить)

Между тем, плоттер нить использовать

while(Fl::wait() > 0) 
    SleepEx(0, TRUE); 

вместо

Fl::run(); 

опрашивать запросы APC.