Как организовать бесконечный цикл в Делфи? #463442


#0 by Stim
Хочу организовать бесконечный цикл в Делфи7, чтобы постоянно обновлялось поле вывода данных случайным числом, но в следующем коде скомпилированный проект просто зависает: procedure TForm1.BitBtn1Click(Sender: TObject); var i: single; n: Extended; r:real; begin while 1=1  do Begin i:= random; n := 0.9 + i*0.001; Label25.Caption := FloatToStr(n); end; end; end. что здесь не так?
#1 by zak555
это недостаточно ? while 1=1  do   Begin   end;
#2 by acsent
Там функция есть типа ProcessMessages
#3 by YauheniL
Имхо, ты грузишь проц бесконечным циклом, а должен использовать параллельные процессы: один считает, другой визуалищирует Либо один и считает и визуализирует, но для этого у него должно быть хорошее время отклика
#4 by Stim
я и говорю - при этом программно тупо зависает, без обновления поля
#5 by Stim
*программа
#6 by acsent
#7 by Злобный Фей
Суровая у тебя программа..
#8 by Злобный Фей
->
#9 by Stim
суровая. мне сейчас нужно по двум кнопкам запускать и останавливать бесконечный цикл. - помогло запустить, спс, вкупе со sleep работает. Но как теперь прерывать цикл по другой кнопке?
#10 by Злобный Фей
А если переменную завести, проверять ее в цикле, а по второй кнопке изменять?
#11 by aka AMIGO
ОФФ. извини, .. где вы берете делфи? он платный? хотелось-бы поюзать, что это такое.. опыт работы с разными языками у меня есть.. полтора десятка - это точно :) для начала хотелось-бы сделать напоминалку на компе о времени обеда.. зы. конечная цель - не покушать, а создать её..
#12 by Rabbit
Числа выводить в обработчике TApplication.OnIdle (Как тут: , только без цикла, т.к. эта процедура сама вызывается в цикле. В обработчиках мыши только устанавливать признак "считаем/не считаем".
#13 by Rabbit
+ Вот только не помню, она вызывается один раз, или пока нет событий...
#14 by romix
В бесконечные циклы вызов sleep надо вставлять, иначе процессор на 100% грузит.
#15 by Злобный Фей
Ващет в дельфях таймер есть..
#16 by romix
Ну да для оконных лучше таймер.
#17 by jbond
- лучше  скачай бесплатно Visual Studio Express:
#18 by Stim
всем спс, код работает: procedure TForm1.BitBtn1Click(Sender: TObject); var i,j: single; n,l: Extended; begin a:= true; while 1=1  do Begin Application.ProcessMessages; sleep; i:= random; n := 0.9 + i*0.001; Label25.Caption := FloatToStr(n); j:= random; l := 0.6 + j*0.001; Label26.Caption:= FloatToStr(l); if a = false then exit; end; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin a:= false; end; теперь пора разбираться с динамическими графиками.. платный.
#19 by Rabbit
Ну тогда Lazarus Изврат!
#20 by Stim
где изврат?:)
#21 by Rabbit
Главный цикл перемещать в обработчик OnClick
#22 by aka AMIGO
спасибо!! :) понятно.. Успехов всем! :)
#23 by Stim
а куда его еще помещать, если он должен выполняться по нажатию на кнопку?
#24 by Злобный Фей
Ну вообще красивше было бы отдельную процедурку. Или даже две. Но если там больше особо ничего больше не будет, то пофиг
#25 by Rabbit
-> Один есть всегда, лучше его и использовать. Пока форма простая, твой код будет работать, но если усложнится будешь иметь геморрой.
#26 by Один С
во первых, для этого используется таймер во вторых, используйте Visual Studio
#27 by Злобный Фей
А в-третьих, тут форум по 1С, так что ее, родимую, и надо использовать, а то ишь, взяли моду, дельфи, студии всякие
#28 by Rabbit
Неправда! Как раз это хорошо видно в сишных исходниках. Embarcadero 2006ю Дельфи бесплатно раздавала, вроде, только в неё нельзя добавлять свои компоненты.
#29 by H A D G E H O G s
Стим, вы, батенька, извращенец.
#30 by Злобный Фей
Вот у меня тоже такое чуйство было, но на оффсайте нынче не видать..
#31 by Один С
что хорошо видно?
#32 by Rabbit
Для простых оконных приложений и реалтайм неоконных часто применяется диспетчер в WinMain.
#33 by Rabbit
Ох и нелитературно выразился я..
#34 by H A D G E H O G s
Эээ, транслэйт, плиз.
#35 by H A D G E H O G s
Нафига? отдельный поток с пониженным приоритетом - спасет отца русской демократии.
#36 by Rabbit
Здиваешься над отцом русской демократии? Поток там даром не нужен :) В простых приложениях, или при простой иерархии объектов, реагирующих на сообщения, обработчики сообщений вызываются прямо в главном цикле приложения.
#37 by H A D G E H O G s
Как бы для обработки события есть, для каждого окна (IsWindow=True) есть WindowProc, и уже в ней идет обработка. Почему? Ну, например, ее можно в любой момент переопределить через SetWindowLong(GWL_WNDPROC,.....) на свою, выполнить свои обработчики, и вызвать/не вызывать стандартные через CallWindowProc
#38 by H A D G E H O G s
Всё пацаны так делают
#39 by Rabbit
Как думаешь, сколько IsWindow=True у ? Представленный тобой случай уже не является "простым" (сравнительно, конечно). Вся эта механика в дельфях утоплена в модели отношений VCL и используется только при порождении новых оконных компонентов. Я-же имел в виду частные случаи вроде: while (GetMessage (&MsgS, NULL, 0, 0)) {    UINT Msg = MsgS.message;    UINT wp = MsgS.wParam;    UINT lp = MsgS.lParam;    if (Msg == WM_KEYDOWN || Msg == WM_KEYUP) {      int VK = wp;              // Код клавиши      BOOL Rpt =  (lp & 0x40000000); // Признак повторения      BYTE Vel = BYTE ((Msg == WM_KEYDOWN)? 127 : 0);      char *p = strchr (KeyToNote, tolower (VK));      if (p && p - KeyToNote < 24) {        if (!Rpt) {             // Повторение пропускаем          MidiOutChan (0x90, BYTE (60 + p - KeyToNote), Vel);        }        continue;      }    }    if (!IsDialogMessage (Dlg, &MsgS)) {      DispatchMessage (&MsgS);    }  }
#40 by AlStorm
Эта... Делфи забросил еще на первом курсе университета, поэтому вот запямотовал: а в нем разве нельзя завести фоновые процессы? Я C# все долгие процессы кидаю в фон, чтобы форма не зависала.
#41 by micha
Thread + procedure TMyThread.Execute; begin while not Terminated do   if w=true  then Synchronize(Form1.OUTD1)  else Synchronize(Form1.OUTD2); end;
#42 by AlStorm
Слава богу. Я уж испугался. Вообще удивительно, что Делфи до сих пор жив. Вроде они с восьмой версии перешли на .NET, нет? Тут то код явно "дельфийский":)
#43 by Андрюха
Delphi и сейчас живее всех живых, только называется уже Embarcadero RAD Studio, последняя версия - 2010.
#44 by skunk
форму перерисовывать надо
#45 by Stim
зачем?
#46 by skunk
потому как она дефолтом не перерисовывается ...
#47 by Stim
а зачем мне перерисовывать форму? Меня в ней все устраивает:)
#48 by supremum
Т. е. нужно что бы с определенной периодичностью обновлялось число в поле вывода? Тогда можно задействовать компоненты таймера и повесить на нее событие. Этот код не очень из-за того что переменная а не вычисляется в теле цикла. Далее пожно использовать цикл с постусловием repeat until.
#49 by supremum
пожно = можно
#50 by skunk
он у тебя не зависает ... а работает ... вот только лабел не обновляется ...
#51 by supremum
+ Можно так же использовать tthread клас, для организации многопоточных приложений.
#52 by supremum
клас=класс
#53 by Stim
все обновляется
#54 by supremum
Лучше воспользоваться компонентой ttimer ИМХО. Код будет красивее )
#55 by Андрюха
Если в цикле используешь ProcessMessages то перерисовывать форму не нужно. Само отрисует.
#56 by Жан Пердежон
в делфе есть класс TThread и к нему пример идет наглядный;
#57 by Ненавижу 1С
TTimer лучше не использовать, бо глюкавый
#58 by Rabbit
Надеюсь, этот ваш thread негромко храпит? ))
#59 by Жан Пердежон
не громче других, бо просто обертка виндовых процедур для работы с потоками
#60 by Rabbit
То что обёртка - это понятно, просто данный поток будет спать почти всё время, имитируя работу таймера. В случае использования чистокровного таймера, не нужно городить синхронизацию.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С