![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день. Есть код:
Код:
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. Потому что арифметический цикл по определению - цикл с заранее известным количеством итераций. В противном случае это уже извращение и запутывание кода. Последний раз редактировалось Bargest, 26.04.2013 в 22:23. |
|
#3
|
|||
|
|||
|
там же написано: приостановить.....
|
|
#4
|
||||
|
||||
|
Если нужно приостановить, выноси код с циклом в таймер (только должен быть уже не цикл) и останавливай когда нужно.
|
|
#5
|
||||
|
||||
|
В асинхронной функции по завершению поставить событие, в цикле сделать WaitForSingleObject.
Если имеется в виду дождаться завершения асинхронной функции. Последний раз редактировалось Bargest, 26.04.2013 в 22:35. |
|
#6
|
||||
|
||||
|
А нафик тогда вообще нужна асинхронная процедура, если вы тупо ждете ее завешения?
|
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Bargest (26.04.2013)
| ||
|
#7
|
|||
|
|||
|
Цитата:
на что это похоже? типа Sleep? |
|
#8
|
||||
|
||||
|
WaitForSingleObject - функция из WinAPI. Убирает поток из планирования, пока указанное событие не сработает или не истечет тайм-аут (который может быть бесконечным).
Только и правда, проще использовать синхронную функцию. |
|
#9
|
|||
|
|||
|
Цитата:
эта процедура вызывает до 10 потоков, каждый из которых подключается к своей ПМ и асинхронно передает результат в накопитель. после чего увеличивает счетчик на +1. таймер пасет счетчик и когда счетчик = 10 необходимо возобновить работу цикла, передать новое значение(строка) в TotalLoader и все по новой, пока в МЕМО не обработаны все строки |
|
#10
|
||||
|
||||
|
Можно и без таймера, с более четким отрабатыванием. Защитить счетчик семафором (его-то все равно надо защищать), и после INC'а проверять, достиг ли 10. По идеи можно в Synchronize сделать работу с глобальным счетчиком. Тот, после чьего инька счетчик стал равен 10, ставит событие главной проге.
Или можно наплодить 10 событий и сделать WaitForMultipleObjects. Теоретически можно извернуться и прямо по хендлу потока работать, т.к. насколько я помню как только поток завершился связанный с ним объект переходит в сигнальное состояние. |
|
#11
|
||||
|
||||
|
к счастью есть из чего выбирать:
Цитата:
|
|
#12
|
|||
|
|||
|
Отказаться от циклов и использовать рекурсию.
|