Странная особенность асинхронной закачки, используя WinHttp

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Странная особенность асинхронной закачки, используя WinHttp

Сообщение Rody66 » 09.10.2011 (Вс) 1:01

Столкнулся вот с такой не совсем понятной для меня вещью, которую лучше продемонстрировать сразу на примере.
Следующий кусок кода асинхронно закачивает содержимое страницы (файла) в переменную:
Код: Выделить всё
On Error Resume Next
Dim whr As New WinHttpRequest, TimeOut As Long
whr.Open "GET", "http://google.com", WINHTTP_FLAG_ASYNC
whr.Send
Do Until whr.StatusText = "OK" Or whr.StatusText = "Not Found"
   DoEvents
Loop
If whr.StatusText = "OK" Then
   Download = True:   GetTo = whr.ResponseText
Else
   Download = False:   GetTo = ""
End If

Выдрано из функции и слегка видоизменено, но тем не менее в сути все так же. Дело в том, что цил do until отлично делает свое дело и когда whr.StatusText возвращается значение "OK", цикл благополучно завершается и переходит на стадию контрольной проверки статуса, так вот что странно - частенько ф-ции возвращается значение False, хоть ответ и "OK", причем при отладке строчки If whr.StatusText = "OK" And whr.ResponseText <> "" Then , мне показывается что, StatusText="OK" и ResponseText так же не пуст, после запуска же, функции возвращается значние True, то есть 100% точного результата можно добиться только при отладке, если же обходится без нее, то очень часто бывает ложный результат, то есть такое ощущение, что после того как в цикле программа "поняла", что ответ есть, до оператора if еще не доходит что, статус уже "OK" и он возвращает ложное значение. Также пробовал ставить после цикла Sleep 1000, но даже это не всегда помогает и иногда функция работает не правильно. Конечно же, это очень странно, и, мягко сказать, не слишком логично. Может кто-нибудь встречала с таким вот парадоксом и знает в чем же все-таки проблема и как узнавать 100% точный результат? Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Хакер » 09.10.2011 (Вс) 2:41

Асинхронный режим используется самым криминальным отвратительным образом.
Никаких ждущих циклов, проверяющих какие-то там условия, быть не должно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Rody66 » 09.10.2011 (Вс) 2:49

Асинхронный режим используется самым криминальным отвратительным образом.
Никаких ждущих циклов, проверяющих какие-то там условия, быть не должно.

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Хакер » 09.10.2011 (Вс) 2:56

Могу: переделывать свой мозг под event-driven-парадигму. Особенно, если взялся за асинхронные штуки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Rody66 » 09.10.2011 (Вс) 3:09

event-driven-парадигму

Приблизительно понятно о чем речь, и все-таки, как же данный ивент не "криминальным" образом запечатлеть?.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Хакер » 09.10.2011 (Вс) 3:45

Rody66 писал(а):"криминальным"

Собственно криминальны только циклы с DoEvents внутри и каким-нибудь условием. Поэтому подобных циклов вообще быть не должно.

А в обработке события нет ничего криминального.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Rody66 » 09.10.2011 (Вс) 11:40

Поэтому подобных циклов вообще быть не должно.

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

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение FireFenix » 09.10.2011 (Вс) 12:53

WinHttpRequest

Rody66 писал(а):В таком случае напрашивается вопрос - что же тогда должно быть?

Использовать событийно-ориентированный подход
Хакер писал(а):event-driven-парадигму


События:
Код: Выделить всё
OnErrorr
OnResponseDataAvailable    
OnResponseFinished    
OnResponseStart


А так же вместо цикла ожидания, использовать метод WaitForResponse (Там же пример на Си)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Странная особенность асинхронной закачки, используя WinH

Сообщение Rody66 » 09.10.2011 (Вс) 13:44

События:

Все конкретно и ясно. Большое спасибо, буду пробовать.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Mail.ru [бот], Yandex-бот и гости: 25

    TopList