Страница 1 из 1

WinInet Асинхронно

Добавлено: 04 Август 2010, 15:01
IKSoft
Добрый день
А кто-нибудь делал WinInet в аснихронном режиме?

Что-то засада у меня.
Если в синхронном, то все работает,
а, если установить флаг INTERNET_FLAG_ASYNC, то на HTTPSendRequest программа вылетает.
Успевает только Message(GetLastError) мелькнуть. Код ошибки Error_IO_Pending.
Делал по примеру на MSDN.

Мне просто сам факт, на Кларионе (6.1) будет работать WinInet в аснихронном режиме?

Re: WinInet Асинхронно

Добавлено: 07 Август 2010, 18:23
WadimZapara
Обязательно будет.
Только нужно сделать всё правильно.

А вообще-то:
Error_IO_Pending - это не ошибка - "Идёт операция ввода-вывода".
По окончании операции GetLastError() возвратит ноль - нужно какое-то время подождать.

А используются ли CallBack-функции ?

Re: WinInet Асинхронно

Добавлено: 09 Август 2010, 14:02
IKSoft
Да, наверно, будет.
Я нашел пример, автор утверждает, что его FTP клиент на Кларионе работает через аснинх.WinInet.

Да, callback используется и IO_Pending не ошибка, она у меня обрабатывается, согласно MSDN.

Пока нашел выход в синхронном режиме, но в отдельном потоке (CreateThread).

Re: WinInet Асинхронно

Добавлено: 11 Август 2010, 5:13
WadimZapara
IKSoft писал(а):Пока нашел выход в синхронном режиме, но в отдельном потоке (CreateThread).
- не выход. или будешь следить не завис ли этот Thread и отшибать в этом случае ?

А программа в асинхронном режиме вылетает из-за неверного распределения ресурсов. А именно:
1) нужно использовать критические секции / семафоры / мютексы для доступа к данным из CALLBACK-функции и основной процедуры - чтоб они одновременно не пытались читать/писать из/в одно и то же место памяти, иначе получается Access violation
2) нужно дожидаться пока закачка завершится как-то - но окончательно, т.е. пока CALLBACK-функция перестанет вызываться операционкой, а уже потом завершать процедуру с её переменными, которые используются CALLBACK-функцией, чтобы не получалось, что основная процедура КЛАРОЙ завершена, память, выделенная КЛАРОЙ под переменные КЛАРОЙ же освобождена, а между тем, ВИНДА с помощью CALLBACK-функции продолжает в эту область памяти что-то писать. Результат - Access violation

Re: WinInet Асинхронно

Добавлено: 13 Август 2010, 13:29
IKSoft
Спасибо, на первый и на второй взгляд, не должно быть Access violation
Оно бы и вылетело, это окошко.
А так, как будто приложение получает сообщение CloseDown

я вернусь к этой теме позже.

Просто я нашел, где у меня был косяк при HTTP-Auth.
И теперь я могу подключаться к HTTP серверу и проходить аутентификацию
используя сокеты, а не WinInet.
Конечно, асинхронные сокеты.

Спасибо