FLTK 值更改和重绘等到回调之后:有啥办法吗?

Posted

技术标签:

【中文标题】FLTK 值更改和重绘等到回调之后:有啥办法吗?【英文标题】:FLTK value change and redraw waits until after callback: any way around this?FLTK 值更改和重绘等到回调之后:有什么办法吗? 【发布时间】:2014-02-26 01:43:32 【问题描述】:

我是 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->redraw() 被调用时,但只有在计算中的其余代码已经执行之后,或者像我一样怀疑,当控件在完成执行后离开回调函数时。

我的问题是:有没有办法在它的值发生变化时以及在执行更多代码之前(可能是在将控制权传递给函数时)实时更新这样的小部件?还是有更好的办法?

谢谢,

R.

【问题讨论】:

【参考方案1】:

我假设您没有向我们展示您实际出现问题的 实际 C++ 代码,所以我的第一个猜测是您正在 GUI 循环中进行长时间运行的处理,即总是个坏主意。

要查看几乎惯用的 FLTK 解决方案,请查看测试目录中的线程示例(您需要对 FLTK 源代码进行语法分析 - 浏览那里的所有 FLTK 示例是个好主意 - 这就是我近 2 年学习 FLTK 的方式以前)。

FLTK手册在本页涉及多线程主题:http://www.fltk.org/doc-1.3/advanced.html

【讨论】:

感谢您的回答...顺便说一句,我找到了我正在寻找的东西,它是 Fl::check();完成了这项工作,但我同意你的观点。我看到很多文献解释了基于线程化一些简单函数的非常基本的多线程原理,并理解了与 lock() 和 unlock() 互斥的原理,但在实践:即我不知道如何设置一个线程,当按下特定按钮(即回调)时,该线程将处理特定(长时间运行)函数。您对此有什么建议吗? 再次,获取 FLTK 源代码,进入“test”目录,检查threads.cxx 和threads.h 文件。这是一个非常好的示例,如何生成一个执行长时间运行进程的线程,以及如何更新 GUI。 :)

以上是关于FLTK 值更改和重绘等到回调之后:有啥办法吗?的主要内容,如果未能解决你的问题,请参考以下文章

刷新、更新和重绘有啥区别?

c++ FLTK 图像重绘

回流和重绘

怎样理解重流和重绘

Kendo-UI图表中的刷新方法和重绘方法有啥区别?

更改某些属性后如何强制重绘小部件?