Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.04.2013, 22:15
Pcrepair
 
Сообщения: n/a
По умолчанию Управление циклом 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  
Старый 26.04.2013, 22:21
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Что значит "управлять"? Если вырубить раньше срока - (@i)^ := Memo1.Lines.Count.
Однако вообще-то по-хорошему в таких случаях юзают цикл while. Потому что арифметический цикл по определению - цикл с заранее известным количеством итераций. В противном случае это уже извращение и запутывание кода.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 26.04.2013 в 22:23.
Ответить с цитированием
  #3  
Старый 26.04.2013, 22:22
Pcrepair
 
Сообщения: n/a
По умолчанию

там же написано: приостановить.....
Ответить с цитированием
  #4  
Старый 26.04.2013, 22:26
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Если нужно приостановить, выноси код с циклом в таймер (только должен быть уже не цикл) и останавливай когда нужно.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 26.04.2013, 22:32
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

В асинхронной функции по завершению поставить событие, в цикле сделать WaitForSingleObject.
Если имеется в виду дождаться завершения асинхронной функции.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 26.04.2013 в 22:35.
Ответить с цитированием
  #6  
Старый 26.04.2013, 22:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А нафик тогда вообще нужна асинхронная процедура, если вы тупо ждете ее завешения?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Bargest (26.04.2013)
  #7  
Старый 26.04.2013, 22:36
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от Bargest
В асинхронной функции по завершению поставить событие, в цикле сделать WaitForSingleObject.
WaitForSingleObject - это что то самопальное или из состава делфи?
на что это похоже? типа Sleep?
Ответить с цитированием
  #8  
Старый 26.04.2013, 22:37
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

WaitForSingleObject - функция из WinAPI. Убирает поток из планирования, пока указанное событие не сработает или не истечет тайм-аут (который может быть бесконечным).
Только и правда, проще использовать синхронную функцию.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 26.04.2013, 23:02
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от Bargest
Только и правда, проще использовать синхронную функцию.
все немного сложнее:
эта процедура вызывает до 10 потоков, каждый из которых подключается к своей ПМ и асинхронно передает результат в накопитель. после чего увеличивает счетчик на +1. таймер пасет счетчик и когда счетчик = 10 необходимо возобновить работу цикла, передать новое значение(строка) в TotalLoader и все по новой, пока в МЕМО не обработаны все строки
Ответить с цитированием
  #10  
Старый 27.04.2013, 00:24
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Можно и без таймера, с более четким отрабатыванием. Защитить счетчик семафором (его-то все равно надо защищать), и после INC'а проверять, достиг ли 10. По идеи можно в Synchronize сделать работу с глобальным счетчиком. Тот, после чьего инька счетчик стал равен 10, ставит событие главной проге.
Или можно наплодить 10 событий и сделать WaitForMultipleObjects. Теоретически можно извернуться и прямо по хендлу потока работать, т.к. насколько я помню как только поток завершился связанный с ним объект переходит в сигнальное состояние.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 28.04.2013, 08:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

к счастью есть из чего выбирать:
Цитата:
Synchronization Functions

CancelWaitableTimer
CreateEvent
CreateMutex
CreateSemaphore
CreateWaitableTimer
DeleteCriticalSection
EnterCriticalSection
GetOverlappedResult
InitializeCriticalSection
InterlockedCompareExchange
InterlockedDecrement
InterlockedExchange
InterlockedExchangeAdd
InterlockedIncrement
LeaveCriticalSection
MsgWaitForMultipleObjects
MsgWaitForMultipleObjectsEx
OpenEvent
OpenMutex
OpenSemaphore
OpenWaitableTimer
PulseEvent
QueueUserAPC
ReleaseMutex
ReleaseSemaphore
ResetEvent
SetEvent
SetWaitableTimer
SignalObjectAndWait
TryEnterCriticalSection
WaitForMultipleObjects
WaitForMultipleObjectsEx
WaitForSingleObject
WaitForSingleObjectEx
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 30.04.2013, 09:39
stanilar stanilar вне форума
Прохожий
 
Регистрация: 31.08.2009
Сообщения: 30
Репутация: 140
По умолчанию

Отказаться от циклов и использовать рекурсию.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter