从另一个选项卡FLTK中开始的线程隐藏小部件
hiding a widget from a thread starting in a different tab 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<--------------------
}
现在,我的问题是,在这个"<-----------"位置,我想隐藏标签b中的警告框。
一切我尝试是否是Fl::awake()
, Fl::awake(&check_from_thread)
其中check_fom_thread是在父(GUI)线程中运行的适当函数(包含box->hide()
Fl::check()
, Fl::flush()
等的每个排列),或线程中的box->hide(),锁解锁对内部或外部,在Fl::awake()调用之前和之后(再次在锁解锁对内部或外部)未能获得正确的功能:
显示了警告框,我切换到第一个选项卡,我按下运行回调然后线程的按钮,但在它完成之前,我切换回第二个选项卡,我希望在线程函数调用完成时警告框消失。但它并没有被隐藏。然而,如果,在线程完成后,我切换到标签a,然后再回到标签b,那么它就会被隐藏。
另一方面,如果不是在选项卡b中隐藏'box',而是在选项卡a中隐藏'control_box',那么我上面描述的几乎所有排列都可以正常工作。
我不知道为什么它会这样做。
有人有什么想法吗?
我认为这可能是因为在Fl_Tabs下使用->hide()和->show()意味着可能会有一些小部件属性的覆盖,但这没有意义,因为如果我切换到选项卡b之前隐藏的线程"盒子"结束,在更新选项卡b的时候显示为小部件"盒子",但盒子无法隐藏。但同样的情况也适用于当线程运行从a结束隐藏'control_box'在更新的时候:标签a显示为'control_box',但这种情况下工作。
我不知道为什么会发生上述情况,但一种应该工作的方式(调用与我想隐藏的框的父小部件相关的redraw()方法)没有,但最后做的是在整个父窗口上调用redraw()。不是特别优雅,但它可以完成工作。
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 反调试器技术:如何使用 VB.NET 对调试器隐藏线程?
- 是否可以从其他线程隐藏qt小部件窗口
- 调用Fl_Double_Window的隐藏方法在多线程 FLTK C++应用程序 (Visual Studio 2010
- 隐藏CreateTool32Help api的线程
- 从另一个选项卡FLTK中开始的线程隐藏小部件