Я работаю над 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
не имеет никакого эффекта
Я думаю, что эта проблема связана с многопоточным поведением, но я не могу догадаться, в чем причина проблемы & как мне это решить.
Пожалуйста, прочитайте Руководство по многопоточности FLTK:
FLTK поддерживает несколько платформ, некоторые из которых не позволяют
другой, кроме основного потока для обработки системных событий и открытия или закрытия
окна. Надежнее всего придерживаться следующих правил для
темы во всех операционных системах:
- не
show()
или жеhide()
все, что содержит виджеты, полученные из Fl_Window, включая диалоги, средства выбора файлов, подокна илиFl_GL_Windows
Вот рекомендуемый FLTK способ обработки Обновления GUI из фонового потока:
Единственный
Обходной путь — хранить то, что вы хотите сделать в статических переменных, вызывать
fltk::awake()
и сделать вызов основного потокаfltk::wait()
несколько раз,
проверка и воздействие на статические значения после каждого вызова.
Других решений пока нет …