【问题标题】:Calling hide method of Fl_Double_Window has no effect in a multi-thread FLTK C++ application (Visual Studio 2010)调用 Fl_Double_Window 的 hide 方法在多线程 FLTK C++ 应用程序中无效(Visual Studio 2010)
【发布时间】:2013-06-10 17:32:24
【问题描述】:

我正在开发一个 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;
}

问题出在我的代码成功执行且没有错误,但是在执行dlg 对象指针的hide 方法后,窗口不会隐藏并似乎调用hide 甚至使用delete dlg 删除窗口对象有没有效果。
我猜这个问题与多线程行为有关,但我无法猜测问题的原因以及我应该如何解决它。

【问题讨论】:

    标签: c++ multithreading widget window fltk


    【解决方案1】:

    请阅读FLTK guide on multithreading

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

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

    这是 FLTK 推荐的处理 GUI updates from a background thread 的方法:

    唯一的 解决方法是将要执行的操作存储在静态变量中,调用 fltk::awake(),并让主线程反复调用fltk::wait(), 每次调用后检查并处理静态值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2014-06-12
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多