Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дождаться завершения выполнения другой функции [D7, WinXP]


Incognito ©   (2006-10-14 06:10:00) 

Здравствуйте, такой вопрос:

приложение работает с удаленным сервером. Для работы с ним использую компонент httpGet, который умеет отправлять запрос на сервер при помощи вызова процедуры GetString, а результат возвращает в событиях OnDoneString(Sender: TObject; Result: String) или OnError.

Дак вот...
при старте программы необходимо проверить валидность некоего id, введенного юзером, сверив его с тем, что есть на сервере.

Для этого написал функцию isValidId, задача которой вернуть true если этот id верный и false в противном случае, но проблема в том, что отправив запрос (httpChecker.GetString) результат мы получим в другой процедуре (OnDoneString), а надо бы, чтобы isValidId все-таки вернула как-то результат.

попытался решить проблему так: завел 2 глобальных переменных isCheckingId, isValidIdResult. Перед вызовом процедуры httpChecker.GetString переменной isCheckingId:=true вхожу в цикл while true do, где не каждой итерации провряю не изменилось ли состояние переменной isCheckingId на фолз, которое должно измениться по окончанию выполнения процедур OnDoneString и OnError.

Вообщем, думаю, кусок кода объяснит все лучше, чем я.


...
...
var
 fmMain: TfmMain;
 isValidIdResult : boolean = false;
 isCheckingId : boolean = false;

...
...

procedure TfmMain.isValidId(id : string);
begin
httpChecker.URL := url + id;
isChecking := true;
httpChecker.GetString;
while true do
 if isChecking = false
   then
     begin
     result := isValidIdResult;
     break;
     end;
end;

procedure TfmMain.httpCheckerDoneString(Sender: TObject; Result: String);
begin
if getDataFromPage(result, newData) then isValidIdResult := true;
isChecking := false;
end;

procedure TfmMain.httpCheckerError(Sender: TObject);
begin
isValidIdResult := false;
isChecking := false;
end;


Да, и, собственно вопрос - корректен ли такой способ, если он вообще осуществим. И есть ли более изящные решения.

З.Ы. Я не профессионал, так.. любитель, так что прошу простить, если что не так, набраться терпения и объяснить, если не трудно, конечно )

заранее спасибо всем кто ответит по делу


Anatoly Podgoretsky   (2006-10-14 13:36:00) [1]


> и во всю использует этот компоненит;

Загадочная вещь, может и с нами поделишься или будешь трепаться и далее?


Anatoly Podgoretsky   (2006-10-14 13:36:00) [2]


> Ketmar ©   (14.10.06 06:17) [2]
> а почему бы не работать с сокетами в блокирующем режиме?
>

Не обязательно блокирующие сокеты, достаточно синхронных функций.


Чапаев   (2006-10-14 09:39:00) [3]

Взять idHTTP из Indy... Тав всё равно всё на блокирующих сокетах.


Incognito   (2006-10-14 06:27:00) [4]

да, как и предполагалось, приложение зависло.

2 Ketmar
1. потому что приложение уже написано практически и во всю использует этот компоненит;
2. Я, к сожалению, не умею работать с сокетами, и уж тем более в блокирущем режиме )

По сути вопрос простой ведь. Можно ли при выполнении функции каким то образом дождаться завершения другой функции.. или изменения какой-то глобальной переменной... Вообщем, я подозреваю, что для этого что-то придумано человечеством.... и, собственно, прошу подсказать


Ketmar   (2006-10-14 06:17:00) [5]

а почему бы не работать с сокетами в блокирующем режиме?


Incognito   (2006-10-14 06:15:00) [6]

Опечатался немного..
конечно же не
procedure TfmMain.isValidId(id : string);
а
function TfmMain.isValidId(id : string) : boolean;


Наверх

Титульная страница Поиск, карта сайта Написать письмо