我在FLTK中遇到了一些奇怪的行为,并试图解决这个问题。基本上,我主要有这样的格式:
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’,但这种情况是可行的。扯掉我的头发!..。
发布于 2014-03-31 17:53:39
我不知道为什么会发生上述情况,但是一种应该工作的方法(调用与我想要隐藏的盒的父小部件相关联的重绘()方法)没有实现,但是最后在整个父窗口上调用重绘()。不是特别优雅,但它做的工作。
https://stackoverflow.com/questions/22719204
复制相似问题