我在FLTK中遇到過一些奇怪的行爲,並試圖解決如何解決它。基本上我有這個格式主要:從開始於不同選項卡的線程隱藏窗口小部件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()
,其中check_fom_thread是(含有box->hide()
Fl::check()
,Fl::flush()
等每個排列)相應的函數在父(GUI)線程運行,或者箱 - >隱藏( )在鎖定解鎖對內部或外部,在Fl :: awake()調用之前和之後(再次在鎖定解鎖對內或外部)未能獲得以下功能:
警告框顯示,我切換到第一個選項卡,我按下運行回調,然後線程的按鈕,但在它結束之前,我切換回第二個選項卡,我期待wa在完成線程函數調用後,ring框消失。但它不會隱藏。但是,如果在線程完成後,我切換到選項卡a然後返回到選項卡b,然後變爲隱藏。
另一方面,如果不是在標籤b中隱藏'box',而是在標籤a中隱藏'control_box',幾乎我上面描述的每個置換都可以正常工作。
我不知道爲什麼它會這樣做。
有沒有人有任何想法?
我認爲這可能是因爲在引擎蓋Fl_Tabs正在使用 - > hide()和 - > show()意味着可能有一些重寫的小部件屬性,但這沒有任何意義,因爲如果我切換到選項卡b在隱藏'盒子'的線程結束之前,在更新標籤時b顯示爲小部件'盒子',但盒子未能隱藏。但同樣的情況適用於在更新時,一個線程從一個隱藏'control_box'結束時運行:選項卡a顯示爲'control_box',但這種情況起作用。把我的頭髮拉出來......