Асинхронное соединение через XMLHTTPRequest

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Асинхронное соединение через XMLHTTPRequest

Сообщение Antonariy » 20.06.2006 (Вт) 10:50

В XMLHTTPRequest при асинхронном запросе нужно проверять его readyState пока он не примет значение READYSTATE_COMPLETE (событий в нем не предусмотрено). Мне нужно как-то это сделать в dll, которая не блокировала бы основную программу, а после завершения запроса сгенерила необходимое событие.

Кроме таймера в голову ничего не приходит, но он мне уже заранее не нравится. Как поступить :?:
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 11:15

Альтернатива(худшая) - цикл с DoEvents..

Таймер...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 11:32

Цикл с DoEvents в теле dll заблокирует основную программу, не подходит.
Таймер...
А если в памяти несколько инстансов dll? Как в процеду таймера передать нужный инстанс?
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 12:02

А если в памяти несколько инстансов dll?
В памяти приложения есть только один инстант dll-файла. Больше не вмещается :)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2006 (Вт) 12:10

Да, но может быть несколько экземпляров объектов внутри него, каждый со своим XMLHTTPRequest-ом.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 12:12

Ну это другое дело;)
Если любите API - можно передавать в процедуру таймера указатель на экземпляр класса.
Если любите VB - пусть каждый экземпляр создает для себя отдельную форму с таймером... Что тут сложного??
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2006 (Вт) 12:14

Если любим стандартную поставку VB, то в ней есть класс XTimer, которому не нужна форма...
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 12:15

(послднее, правда, требует что бы приложение-клиент позволяло показывать немодальные формы...)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 12:29

Да, но может быть несколько экземпляров объектов внутри него, каждый со своим XMLHTTPRequest-ом.
Это я и имел ввиду. Перепутал "экземпляр" с "инстансом".
форму с таймером
Забыл про контрол Timer. :? Н-да, пора в отпуск. :drunken:

Диалог в dll уже имеется, почему бы не задействовать его и для этих целей. А как через апи передать параметр в процедуру таймера (собственно это и спрашивал)? Попробую, пожалуй, все. :wink:
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 12:30

ANDLL писал(а):(послднее, правда, требует что бы приложение-клиент позволяло показывать немодальные формы...)
Обязательно показывать? Load недостаточно?
Как называется ссылка?
Последний раз редактировалось Antonariy 20.06.2006 (Вт) 12:32, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 12:32

А как ты через API-создаеш таймер? Там у процедуры таймера есть один так сказать User-defined параметр :)
(нет, достаточно просто загрузить в память...)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 12:36

UINT_PTR SetTimer(
HWND hWnd, // handle to window
UINT_PTR nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // timer procedure
);

Идентификатор?
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 12:38

да.
просто поменяй в объявлении функции SetTimer и своей nIDEvent as long на Byval Nclass as YourClass.
И проследи что бы класс не помер к моменту вызова функции таймера.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 13:04

При доступе к переменной класса из процедуры таймера, эта процедура вроде как запускается заново.
Код: Выделить всё
Sub TimerFunc(x As ADOHTTP.Connection)
    On Error GoTo errh
    If Not x Is Nothing Then Debug.Print x.State
    Exit Sub
errh:
    Debug.Print Err.Description
End Sub

В окне отладки ничего не печатается.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 13:13

BYVAL
это раз.
А то что процедура таймера
запускается заново
нет ничего удивительного
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 13:33

Byval учел, перезапускаться прекратила, но x всегда Nothing.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 13:43

А как создаеш таймер?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 13:51

Код: Выделить всё
hTimer = SetTimer(0, lConnection, 100, AddressOf TimerFunc)

Пробовал передавать вместо lConnection ObjPtr(lConnection), но с ByVal параметр всегда равен 0, а без - процедура опять таки перезапускается при получении объекта.
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2006 (Вт) 14:20

А lConnection у тебя грешным делом не Nothing на момент создания таймера?
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 14:22

Как объявлена функция SetTimer?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 14:33

tyomitch
По определению не может - в процедуру, вызывающую SetTimer, передается как Me.

ANDLL
Для объекта
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As ADOHTTP.Connection, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Для ObjPtr
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long


И все-таки, что такое XTimer? В реестре я его не нашел.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.06.2006 (Вт) 14:51

А почему нельзя обойтись одним таймером?
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2006 (Вт) 14:51

Antonariy, а допиши для гарантии рядом с SetTimer: MsgBox ObjPtr(lConnection)
Не ноль ли у тебя будет? :-?


XTimer надо искать не в реестре, а в MSDN
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 15:37

tyomitch
Не ноль :)

alibek
Запустить бы хоть один))
Хотя если ограничиться одним и коллекцией реквестов на уровне инстанса, то можно не передавать параметры, а просто проверять всю коллекцию, а если в ней не осталось элементов, убивать таймер.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.06.2006 (Вт) 16:08

Я это и имел ввиду, один таймер, одна диспетчерская процедура (TimerProc) и коллекция инстансов.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2006 (Вт) 16:13

Antonariy, так что: XTimers нашёл?
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2006 (Вт) 16:14

Нашел, внедряю :)
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2006 (Вт) 16:25

2Antonariy:
проследи что бы класс не помер к моменту вызова функции таймера
Сразу после вызова SetTimer надор вызвать функцию ZombieAddRef из msvbvm60.dll, и передать ей в качестве единственного параметра твой объект...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2006 (Вт) 16:42

Тогда уж лучше не её непосредственно, а __vbaObjAddref, чтобы вызов прошёл через VTbl: мало ли, что там прописано в качестве AddRef.
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.06.2006 (Ср) 11:29

Последнее не буду пробовать даже под угрозой пыток.

Из всех опробованных вариантов, XTimer признан самым удобным решением :wink:
Лучший способ понять что-то самому — объяснить это другому.

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList