Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
ВнизБлокируется вывод в Edit в цикле Найти похожие ветки
← →
EsKor (2002-04-12 09:00) [0]На досуге проверял категоричное утверждение одного автора одной книги, что переменная (счетчик) цикла после его завершения неопределена, наткнулся на может быть мелкие, но грабли в следующем коде:
procedure TForm1.Button1Click(Sender: TObject);
var i: Cardinal;
begin
Edit2.Text := "Ждите!"; //что-бы не волноваться если цикл будет долгим
for i := 1 to StrToInt(Edit1.Text) do; //просто пустой цикл
Edit2.Text := IntTostr(i); //отобразить значение счетчика цикла
end;
Здесь было наивное предположение, что в Edit2 сначала появится слово "Ждите!", а затем начнет выполняться цикл. Но не тут-то было - ничего нового в Edit2 не появляется пока не закончится цикл. Я вобщем-то нашел решение, вставив перед циклом инструкцию Application.ProcessMessages. Правда появляется аналогичная проблема если инструкцию Edit2.Text := IntTostr(i); поместить в тело цикла, т.е. пытаться отображать значение счетчика при каждом его проходе - опять же надо туда помещать и Application.ProcessMessages, что заметно увеличивает время выполнения цикла. Как-то не уютно от мысли, что здесь что-то не так: если это особенность Windows вообще, то получается, что похожие ситуации нужно "пасти" и вставлять, как мне думается, лишний код (может есть другие решения?), или это какой-то глюк в имеющеся у меня версии Delphi?
← →
Alx2 (2002-04-12 09:05) [1]Edit1 должен перерисоваться. Для этого надо обработать сообщение. Эту возможность дает ProcessMessages
← →
Игорь Шевченко (2002-04-12 09:25) [2]День добрый,
Или ProcessMessages, или после присвоения значения Edit1.Text надо вызывать Edit1.Update;
С уважением,
← →
KSergey (2002-04-12 09:37) [3]Да это не глюк, вам верно ответили
Как вариант - можно еще вызвать метод Repaint и ему подобные (вроде там еще какой-то есть) для немедленной отрисовки элемента.
Я бы посоветовал вам почитать как Windows вообще-то работает.
← →
EsKor (2002-04-12 10:02) [4]Спасибо за ответы!
Кое что о работе Windows я знаю, конечно далеко не все. Просто я не ожидал, что, в частности циклы, так круто "подвешивают" систему.
← →
kull (2002-04-12 10:26) [5]Они не подвешивают систему.
Просто у тебя цикл крутится в главном потоке, который обрабатывает все ее события в том числе и на перерисовку.
И пока не выйдешь из процедуры обработки события, следующие стоящие за ним в очереди не обработаются.
А ProcessMessages принудительно заставляет программу обрабатывать события, накопивщиеся в очереди.
Так что система не виснет, просто это такой концепт.
Есть еще одно решение и на мой взгляд - правильное, особенно если циклы долгие - это отдельный поток TThread.
← →
REA (2002-04-12 10:46) [6]Никто не заставляет перерисовывать каждый раз. Можно и раз в секунду.
← →
EsKor (2002-04-12 10:51) [7]> kull
Т.е. дело не совсем в цикле и на самом деле информация, в этом случае, в Edit (без принуждения) обновится только после завершения обработки щелчка на кнопке? Да, до сих пор я как то на это не обращал внимания и не задумывался, видимо случая не было.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c