2014-03-28 38 views
0

我在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',但這種情況起作用。把我的頭髮拉出來......

回答

0

我不知道爲什麼會發生上面的情況,但一種本該工作的方式(調用與我想隱藏的盒子的父窗口小部件關聯的redraw()方法)didn 't,但最後在整個父窗口中調用了redraw()。不是特別優雅,但是它完成了這項工作。

相關問題