WinInet Асинхронно

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
IKSoft
Посетитель
Сообщения: 45
Зарегистрирован: 27 Май 2010, 13:38

WinInet Асинхронно

Сообщение IKSoft »

Добрый день
А кто-нибудь делал WinInet в аснихронном режиме?

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

Мне просто сам факт, на Кларионе (6.1) будет работать WinInet в аснихронном режиме?
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

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

Сообщение WadimZapara »

Обязательно будет.
Только нужно сделать всё правильно.

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

А используются ли CallBack-функции ?
Компьютер имеет то преимущество перед мозгом, что им пользуются...
IKSoft
Посетитель
Сообщения: 45
Зарегистрирован: 27 Май 2010, 13:38

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

Сообщение IKSoft »

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

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

Пока нашел выход в синхронном режиме, но в отдельном потоке (CreateThread).
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

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

Сообщение WadimZapara »

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

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

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

Сообщение IKSoft »

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

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

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

Спасибо
Ответить