0

我正在开发一个 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都没有效果。
我猜这个问题与多线程行为有关,但我猜不出问题的原因以及我应该如何解决它。

4

1 回答 1

0

请阅读关于多线程的 FLTK 指南

FLTK 支持多个平台,其中一些平台除了主线程之外不允许任何其他平台来处理系统事件和打开或关闭窗口。安全的做法是在所有操作系统上遵守以下线程规则:

  • 不要show()hide()任何包含从 Fl_Window 派生的小部件,包括对话框、文件选择器、子窗口或Fl_GL_Windows

这是 FLTK 推荐的从后台线程处理 GUI 更新的方法:

唯一的解决方法是将您想要做的事情存储在静态变量中, call ,并反复fltk::awake()调用主线程,在每次调用后检查并处理静态值。fltk::wait()

于 2013-06-10T17:37:25.183 回答