Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.47 MB
Время: 0.036 c
15-1160132726
Layner
2006-10-06 15:05
2006.10.29
Знает ли кто нибудь, почему в Win2003 с последними патчами


6-1149253097
kreyl
2006-06-02 16:58
2006.10.29
Как запустить функцию на сервере и получить ее результат?


15-1160038958
worldmen
2006-10-05 13:02
2006.10.29
Подобрать Switch.


4-1150222081
kliman
2006-06-13 22:08
2006.10.29
Перехват комбинации клавиш


2-1160719741
Alex_C
2006-10-13 10:09
2006.10.29
Почему мерцает TMemo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский