Другие языки программирования и технологии

Delphi!? Repeat Unitl... бесконечный цикл (вся прога зависает)?

repeat for m:=0 to g-1 do begin if (vrema[m]=handm) then ShowMessage('MY TEXT MSG'); end; until not flag; ситуация следующая: нажимаю кнопку Выполнить этот цикл и вся программа зависает, т.е. остальные кнопки нажать невозможно и закрыть форму тоже, при создании формы flag=true, на форму еще кинул кнопку STOP, для остановки цикла, т.е. в ней flag=false, по идее должно все работать, но нажать ее я немогу из-за того что все зависло, как такого избежать?
repeat
for m:=0 to g-1 do
{ begin здесь не нужен }
if (vrema[m]=handm) then
ShowMessage('MY TEXT MSG'); { вот эти сообщения нужно перенаправить куда-нибудь.. . лучше в поле Memo }
{ end здесь не нужен }
Application.ProcessMessages; { вот эта строчка не даст твоему циклу игнорировать другие действия }
until not flag;
ДО
Дима Орманжи
99 849
Лучший ответ
А как задаётся начальное для vrema, vrema[m], handm и g?
Издаля не видно, но вполне может виснуть, например, на кривом обращении к памяти в vrema.
Айдар Пазыл
Айдар Пазыл
75 320
Сергей Горностаев вы внимательно вопрос прочитали?
Сергей Горностаев vrema это постоянный массив данных (строковый), задается обычно внесением в него данных:
vrema[1]:='22:55'; и т.п. в общем данные тут не при чем.
Компьютерные анекдоты и истории
Жена пpогpаммеpа говоpит мужу :
Ж: Доpогой, я хочу pебенка.
П: (Расстегивая шиpинку) Ща пpоинсталлиpуем 8*)
Сергей Горностаев ага, особенно в контексте того что я забыл о банальном таймере. гыыыы
Все компоненты VCL работают в одном потоке, поэтому если ты что то делаешь по нажатию одной кнопки, то пока не завершиться этот метод - действие второй кнопки обрабатываться не будет. Но всеже, в какой то мере может помочь метод Synchronize, но это решение будет подвержено некоторым глюкам. Вообще правильнее бы было засунуть ваш "бесконечный" код в потомка класса TThread как раз и предназначенного для параллельного исполнения нескольких потоков.
можно поставить какой нибудь счетчик и если допустим количество превышает норму то брякнуть цикл.
Izya ...
Izya ...
7 837
Сергей Горностаев он у меня бексонечно должен выполняться, т.е. 24 часа в сутки, но так чтобы я его мог остановить
Нужно использовать многопоточность Windows, но боюсь уровень твоей подготовки недостаточен для этого.. . В качестве полумеры могу предложить в цикл вставить Application.ProcessMessages();
А вообще лучше делай консольное пиложение и не парь мозги, или тебе обязательно нужен VCL?
Anuar Maibalayev
Anuar Maibalayev
5 916
Сергей Горностаев неа, консоль наврядли прокатит, у меня с инетом связано