Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Дождаться завершения выполнения другой функции   Найти похожие ветки 

 
Incognito   (2006-10-14 06:10) [0]

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

приложение работает с удаленным сервером. Для работы с ним использую компонент 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;


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

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

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


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

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


 
Ketmar ©   (2006-10-14 06:17) [2]

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


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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2006-10-14 13:36) [5]


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

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


 
Anatoly Podgoretsky ©   (2006-10-14 13:36) [6]


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.061 c
2-1160906180
C@N
2006-10-15 13:56
2006.10.29
ScroolBars в Memo


15-1159951163
BadTester
2006-10-04 12:39
2006.10.29
Оцените, вот наднях написал программу Smart FM !!!


1-1157690774
Roma K
2006-09-08 08:46
2006.10.29
Ввод текта в окне чужего приложения


15-1160556913
litt
2006-10-11 12:55
2006.10.29
where DPO in


8-1143270941
Andry
2006-03-25 10:15
2006.10.29
GLScene и объект