Я новичок в графическом интерфейсе и изучаю 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(), а только после того, как остальная часть кода в calculate выполнена или, как я подозреваю, когда управление покидает функцию обратного вызова после завершения ее выполнения.
Мой вопрос: есть ли способ обновить такой виджет в режиме реального времени, когда его значение изменяется и перед выполнением какого-либо другого кода (что может быть, пока управление передается функции)? Или есть лучший способ?
Спасибо,
R.