从一个从另一个标签FLTK开始的线程中隐藏一个小部件

时间:2014-03-28 17:13:02

标签: c++ fltk

我在FLTK中遇到了一些奇怪的行为,并试图找出如何解决它。基本上我在main中有这种格式:

int main(){

    Fl::lock(); //will be doing multithreading
    win= new Fl_Double_Window(0.5*(Fl::w()-w),0.5*(Fl::h()-h),w,h, "Program");
    win->begin();

    Fl_Tabs* oo = new Fl_Tabs(10,20,win->w()-20,win->h()-140);

        {Fl_Group* a = new Fl_Group(20, 40, oo->w(),oo->h(), "Send to ");
            Fl_Box* control_box= Fl_Box(x,y,w,h,"Comparison Test");
            Fl_Button* button = Fl_Button(x,y,w,h,"run");
            button->callback((Fl_Callback*) run_cb);
        a->end();
        }
        {Fl_Group* b = new Fl_Group(20, 40, oo->w(),oo->h(), "");
            Fl_Box* box= Fl_Box(x,y,w,h,"Warning");
            box->hide();
            //user does something here which causes box to box->show(); displaying warning
        b->end();
        }

    oo->end();

    win->end();
    return Fl::run();

}

//functions

void run_cb(Fl_Widget* widget,void* data){

    fl_create_thread(thread1,calculate,NULL);

}

void* calculate(void* data){
    //do some calculations
    Fl::lock();
    //update some data structures
    Fl::unlock();
    //PROBLEM IS HERE<--------------------
}

现在,我的问题是,在这个“&lt; -----------”位置,我想隐藏选项卡b中的警告框。

一切我尝试是Fl::awake()Fl::awake(&check_from_thread)其中check_fom_thread是适当的函数(包含box->hide() Fl::check()的每个排列,{ {1}}等)在Fl :: awake()调用之前和之后,在线程中,锁定解锁对内部或外部的父(GUI)线程或box-&gt; hide()中运行(再次在锁定解锁对内部或外部)无法获得正确的功能:

显示警告框,我切换到第一个选项卡,我按下运行回调的按钮然后线程,但在完成之前我切换回第二个选项卡,我希望警告框在完成后消失线程函数调用。但它不会被隐藏。但是,如果在线程完成后,我切换到制表符a然后返回制表符b然后变为隐藏。

另一方面,如果不是在选项卡b中隐藏'box',我会在tab a中隐藏'control_box',几乎我在上面描述的每个排列都可以正常工作。

我不知道为什么会这样做。

有没有人有任何想法?

我认为这可能是因为引擎盖Fl_Tabs正在使用 - &gt; hide()和 - &gt; show()意味着可能有一些覆盖小部件属性,但这没有意义,因为如果我切换到在隐藏'box'结束的线程之前的tab b,在更新时选项卡b显示为widget'box',但是框无法隐藏。但是当一个线程在更新时从一端隐藏'control_box'时,同样的情况也适用:tab a显示为'control_box',但这种情况有效。撕掉我的头发!...

1 个答案:

答案 0 :(得分:0)

我不知道为什么会发生这种情况,但是一种应该工作的方式(调用与我想要隐藏的方框的父窗口小部件相关联的redraw()方法)并没有,但最后是什么做了在整个父窗口上调用redraw()。不是特别优雅,但它确实起到了作用。