Задать вопрос
Acidmind
@Acidmind

Вывод данных в WxRuby

При нажатии на кнопку запускается метод print, который выводит 01234 в интерпретатор и в текстовое поле. В интерпретатор выводятся данные каждую секунду по одному, а в текстовое поле только после завершения программы все сразу. Подскажите пожалуйста, как добиться чтобы в текстовом поле данные появлялись также как в интерпретаторе, по мере выполнения цикла.
def print
 5.times{| i |
    # Вывод данных в интерпретатор
    p i
    # Вывод данных в текстовое поле
    text.value +=  i.to_s
    sleep 1
  }
end
  • Вопрос задан
  • 2636 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
AMar4enko
@AMar4enko
У вас жесткий цикл, да еще и со слипом внутри.
Любые фреймворки типа WxRuby основаны на событиях. И любое взаимодействие с интерфейсом обрабатывается в глобальном цикле обработки событий.
Если представить, что происходит в вашем случае, то при обработке события нажатия на кнопку запускается ваш цикл, который захватывает управление и отдает только после прохождения всего цикла целиком, после чего управление возвращается обратно в основной цикл обработки событий и текстовый элемент обновляется.
Для того, чтобы заработало конкретное данное решение, вам вместо sleep нужно сделать цикл, который будет крутиться одну секунду и внутри которого будет выполняться обработка событий (http://wxruby.rubyforge.org/doc/app.html#App_dispatch)

Можно попробовать
def print
 Thread.new do
   5.times{| i |
      # Вывод данных в интерпретатор
      p i
      # Вывод данных в текстовое поле
      text.value +=  i.to_s
      sleep 1
    }
  end
end

P.S. Ну и тег странный, конечно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Acidmind
@Acidmind Автор вопроса
Помогло использование вместо
text.value += i.to_s
Вот этого
text.append_text i.to_s
Но при этом пока работает программа - интерфейс висит при даже клике по нему.

А вот использование потоков как советовал @AMar4enko решило все проблемы!
Решение с потоками заработало после добавления в описание класса таймера:
timer = Wx::Timer.new(self, Wx::ID_ANY)
evt_timer(timer.id) {Thread.pass}
timer.start(100)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы