|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Управление циклом FOR
Добрый день. Есть код:
Код:
var Main: TMain; gFlag:Boolean; implementation .............. procedure TMain.Button1Click(Sender: TObject); (* 25.04.13 Поцедура, время работы 20...30 сек*) procedure TotalLoader(Str:string); begin gFlag:=False; (*много всякого*) gFlag:=True; (*в конце работы устанвливает флаг*) end; (*-------------------------------------------*) var I:integer; StrRequest,FullListOfRequest:string; begin if (Memo1.Lines.Count > 0) then begin for I := 0 to Memo1.Lines.Count-1 do begin StrRequest:=Memo1.Lines[i]; TotalLoader(StrRequest); (*вызов асинхронной процедуры*) // нужно преостановить выполнение цикла пока не отработает TotalLoader // и не установит gFlag:=True; end; end else ShowMessage('Enter Search Request!'); end; Вопрос: есть ли возможность(как?) управлять работой цикла, или надо как то по другому? |
#2
|
||||
|
||||
Что значит "управлять"? Если вырубить раньше срока - (@i)^ := Memo1.Lines.Count.
Однако вообще-то по-хорошему в таких случаях юзают цикл while. Потому что арифметический цикл по определению - цикл с заранее известным количеством итераций. В противном случае это уже извращение и запутывание кода. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 26.04.2013 в 22:23. |
#3
|
|||
|
|||
там же написано: приостановить.....
|
#4
|
||||
|
||||
Если нужно приостановить, выноси код с циклом в таймер (только должен быть уже не цикл) и останавливай когда нужно.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
В асинхронной функции по завершению поставить событие, в цикле сделать WaitForSingleObject.
Если имеется в виду дождаться завершения асинхронной функции. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 26.04.2013 в 22:35. |
#6
|
||||
|
||||
А нафик тогда вообще нужна асинхронная процедура, если вы тупо ждете ее завешения?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Bargest (26.04.2013)
|
#7
|
|||
|
|||
Цитата:
на что это похоже? типа Sleep? |
#8
|
||||
|
||||
WaitForSingleObject - функция из WinAPI. Убирает поток из планирования, пока указанное событие не сработает или не истечет тайм-аут (который может быть бесконечным).
Только и правда, проще использовать синхронную функцию. jmp $ ; Happy End! The Cake Is A Lie. |
#9
|
|||
|
|||
Цитата:
эта процедура вызывает до 10 потоков, каждый из которых подключается к своей ПМ и асинхронно передает результат в накопитель. после чего увеличивает счетчик на +1. таймер пасет счетчик и когда счетчик = 10 необходимо возобновить работу цикла, передать новое значение(строка) в TotalLoader и все по новой, пока в МЕМО не обработаны все строки |
#10
|
||||
|
||||
Можно и без таймера, с более четким отрабатыванием. Защитить счетчик семафором (его-то все равно надо защищать), и после INC'а проверять, достиг ли 10. По идеи можно в Synchronize сделать работу с глобальным счетчиком. Тот, после чьего инька счетчик стал равен 10, ставит событие главной проге.
Или можно наплодить 10 событий и сделать WaitForMultipleObjects. Теоретически можно извернуться и прямо по хендлу потока работать, т.к. насколько я помню как только поток завершился связанный с ним объект переходит в сигнальное состояние. jmp $ ; Happy End! The Cake Is A Lie. |
#11
|
||||
|
||||
к счастью есть из чего выбирать:
Цитата:
Пишу программы за еду. __________________ |
#12
|
|||
|
|||
Отказаться от циклов и использовать рекурсию.
|