首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个选项卡FLTK中开始的线程隐藏一个小部件

从另一个选项卡FLTK中开始的线程隐藏一个小部件
EN

Stack Overflow用户
提问于 2014-03-28 17:13:02
回答 1查看 284关注 0票数 0

我在FLTK中遇到了一些奇怪的行为,并试图解决这个问题。基本上,我主要有这样的格式:

代码语言:javascript
复制
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<--------------------
}

现在,我的问题是,在这个“<-”

我尝试的一切--无论是Fl::awake()Fl::awake(&check_from_thread),其中check_fom_thread是在父线程(GUI)线程中运行的适当函数(包含box->hide() Fl::check()Fl::flush()等的每个置换),还是box->hide()在线程中、在锁解锁对内部或外部、在Fl::check_fom_thread()调用之前和之后(同样在锁解锁对内部或外部)->hide()->hide()->hide()在Fl::awake()调用之前和之后(再次在锁解锁对内部或外部)无法获得正确的功能:

警告框显示,我切换到第一个选项卡,按下运行回调的按钮,然后是线程,但在它完成之前,我切换回第二个选项卡,在该选项卡完成线程函数调用后,警告框将消失。但它不会被藏起来。但是,如果在线程完成后,我切换到选项卡a,然后返回到选项卡b,那么它就会被隐藏起来。

另一方面,如果我将'control_box‘隐藏在选项卡a中而不是隐藏在选项卡b中的'box’,那么上面描述的几乎每一个排列都很好。

我不知道它为什么要这么做。

有人有什么想法吗?

我认为这可能是因为Fl_Tabs使用的是->hide()和->show(),这意味着可能会有一些小部件属性的重写,但这是没有意义的,因为如果在隐藏' box‘端的线程之前切换到制表符b,则更新选项卡b显示为“小部件框”,但是box无法隐藏。但是,当线程在更新时最后隐藏'control_box‘时,同样的情况也会出现:选项卡a显示为'control_box’,但这种情况是可行的。扯掉我的头发!..。

EN

回答 1

Stack Overflow用户

发布于 2014-03-31 17:53:39

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22719204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档