我是GUI的新手,正在学习FLTK以生成多平台应用程序。在应用程序中,用户单击按钮并通过回调调用耗时的功能。由于需要很长时间,我想用函数的进度更新输出小部件。因此,我将指针传递给Fl_Ouput小部件,并使用widget-> value(x)和widget-> redraw()进行更新。但是,小部件仅在整个回调函数完成时重绘,使整个事情变得毫无意义,因为它不会实时更新用户。代码的格式为:
void calculate(Fl_Widget* widget,Fl_Output* op){
/*function call to actual code but contains inside a loop:*/
stringstream progress;
progress<<p; //where p is some percentage calculated on the fly in the function
op->value(progress.str().c_str());
op->redraw();
}
int main(){
/*main and GUI code*/
Fl_Output* op = new Fl_Output(100,50,100,10,0);
Fl_Button* go = new Fl_Button(100,100,10,10,"Go");
go->callback((Fl_Callback*) calculate,op);
/*rest of GUI code and main*/
}
我的问题是op指向的小部件在我想要的时候不是按顺序重绘,当调用op-&gt; redraw()时,只有在calculate中的其余代码执行后才会重新绘制,或者as我怀疑,当控件在执行完毕后离开回调函数时。
我的问题是:有没有办法在更改其值并在执行任何更多代码之前实时更新这样的小部件(可能是在控制传递给函数时)?或者有更好的方法吗?
谢谢,
R上。
答案 0 :(得分:0)
我假设您没有向我们展示实际出现问题的实际 C ++代码,所以我的第一个猜测是您在GUI循环中进行长时间运行的处理,这是总是一个坏主意。
要查看几乎惯用的FLTK解决方案,请检查测试目录中的线程示例(您需要克服FLTK源代码 - 最好通过那里的所有FLTK示例 - 这就是我学习FLTK近20年的方法前)。
FLTK手册触及此页面上的多线程主题:http://www.fltk.org/doc-1.3/advanced.html。