Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизДождаться завершения выполнения другой функции Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c