调用Fl_Double_Window的隐藏方法在多线程 FLTK C++应用程序 (Visual Studio 2010

Calling hide method of Fl_Double_Window has no effect in a multi-thread FLTK C++ application (Visual Studio 2010)

本文关键字:应用程序 C++ FLTK Visual 2010 Studio 多线程 Double Fl Window 方法      更新时间:2023-10-16

我正在开发一个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(), 每次调用后检查并处理静态值。