многопоточность — вызов метода скрытия для Fl_Double_Window не влияет на многопоточное приложение FLTK C ++ (Visual Studio 2010)

Я работаю над C ++ FLTK-приложением. Это многопоточное приложение, которое создает & показывает модальное окно в потоке, используя следующий код:

Fl_Double_Window* dlg = new Fl_Double_Window(0, 0, 200, 100);
...
dlg->set_modal();
Fl::visual(FL_DOUBLE|FL_INDEX);
dlg->show();

тогда в той же теме я создаю новую тему & передать указатель на Fl_Double_Window объект в качестве параметра потока:

CreateThread(
NULL,                   // default security attributes
0,                      // use default stack size
&beginProgress,     // thread function name
(LPVOID) dlg,       // argument to thread function
0,                      // use default creation flags
NULL);

& в моей функции потока я делаю некоторые операции & тогда мне нужно скрыть показ модального окна:

DWORD WINAPI beginProgress(LPVOID args)
{
//do some operations
((Fl_Double_Window*)args)->hide();
return 0;
}

проблема здесь в том, что мой код успешно выполняется без ошибок, но после выполнения hide метод dlg указатель объекта, окно НЕ скрывает & кажется, зовет hide или даже удаление объекта окна с помощью delete dlg не имеет никакого эффекта
Я думаю, что эта проблема связана с многопоточным поведением, но я не могу догадаться, в чем причина проблемы & как мне это решить.

0

Решение

Пожалуйста, прочитайте Руководство по многопоточности FLTK:

FLTK поддерживает несколько платформ, некоторые из которых не позволяют
другой, кроме основного потока для обработки системных событий и открытия или закрытия
окна. Надежнее всего придерживаться следующих правил для
темы во всех операционных системах:

  • не show() или же hide() все, что содержит виджеты, полученные из Fl_Window, включая диалоги, средства выбора файлов, подокна или Fl_GL_Windows

Вот рекомендуемый FLTK способ обработки Обновления GUI из фонового потока:

Единственный
Обходной путь — хранить то, что вы хотите сделать в статических переменных, вызывать
fltk::awake()и сделать вызов основного потока fltk::wait() несколько раз,
проверка и воздействие на статические значения после каждого вызова.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]