Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Wininet API, Wininet API & Threads 
V
    Опции темы
MadGod
Дата 30.9.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.9.2005

Репутация: нет
Всего: нет



Собственно, хотелось только узнать.. если я хочу качать файлы многопоточно.. то мне в каждом потоке надо исполнять InternetConnect или достаточно передать указатель возвращенный им, а создавать только запросы с помощью HttpOpenRequest?..
PM   Вверх
Mad
Дата 30.9.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 2
Всего: 19



Вызывать InternetConnect нужно отдельно в каждом потоке (и вообщето после каждого запроса надо проверять не разорвалося ли соединение smile )


--------------------
user posted image
PM MAIL   Вверх
MadGod
Дата 10.1.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.9.2005

Репутация: нет
Всего: нет



Спасибо, ответ прочел давно... но к сожалению - забыл поблагодарить - извиняюсь!
PM   Вверх
Neitron
Дата 12.1.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 3
Всего: 5



Ты монстр=)


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
ilya333
Дата 22.1.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 22.1.2006

Репутация: нет
Всего: нет



Пытаюсь написать программку, которая бы в многопоточном режиме искала и отслеживала состояние FTP-серверов (и просто компьютеров при помощи эхо).
Основываясь на личном опыте, пришёл к выводу, что использовать в своих программах всякие готовые компоненты, - это не для меня. Потому что в них обычно заложено много всего, а того, что нужно мне, как обычно, нет. А задачи то тривиальные. Не нужны мне всякие навороты. Я хочу, чтобы код был компактный, без всяких излишеств, и чтобы мне самому было понятно, что происходит в программе, и что нужно делать в каждом конкретном случае. Давно убедился, что третьей версии Delphi для простых программерских нужд всегда хватает, так сказать, "выше крыши". Ведь в неё заложено всё, что нужно, и нет ничего лишнего.

"Delphi 3 - FOREVER".

Вот и сижу, пытаюсь по MSDN понять, как при помощи стандартных API функций, имеющихся в WinInet, сделать то, что мне нужно. Не получается.
В один поток всё работает замечательно, да вот только на выполнение команды InternetConnect уходит примерно 22 секунды (тайм-аут, который тоже хотелось бы как-то уменьшить) для каждого IP-адреса, который не отвечает. А я хочу, чтобы проверка доступности происходила, скажем для 765 адресов, за минуту-две, а не за 2 часа. Т.е. нужно как-то создать многопоточность (например, от двух до 10 потоков), ведь в асинхронном режиме эти команды, вроде бы как, должны работать. Но как это сделать, я не знаю.
Нашёл готовое решение (реально работающее как надо), но есть два НО:
1) Оно написано на С++, а я этот синтаксис терпеть не могу. Любое чтение программ, написанных на С++, вызывает у меня постепенное отвращение, отупление и озлобление от того, что я ни фига не пониманию, хотя, вроде бы, всё понятно.
2) Там используется решение, основанное не на WinInet, а на создании Socket-ов. А в этом я тоже ничего не понимаю. Delphi я изучаю только по help-ам, которые там есть, а в них про WinInet ничего не написано.

Облазив Инет, я пришёл к выводу, что на функциях WinInet сделать многопоточность не удастся. Отсюда вопрос: я прав, и мне надо забросить идею с WinInet и заняться сокетами, или всё-таки это возможно?
PM MAIL   Вверх
Fixin
Дата 22.1.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Во-первых, для заданного тобою вопроса, нужна отдельная тема.
Во-вторых, есть раздел "С++ Сети"
В-третьих, для создания многопоточности используется совсем другой API, а не WinInet.
В-четвертых, если хочешь, что бы тебе объяснили прогу на си, выложи ее сюда. (к стати, я знаю и паскаль, но от этого не возникло отвращения ни к одному из них smile)

Вобщем, желаю удачи в "изыскании резервов" smile
PM MAIL ICQ   Вверх
Aleksandor
Дата 22.1.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Сам я не работал с WinInet но в доках написано что эти функции могут работать в асинхронном режиме. Вот текст из MSDN-


Setting Up Asynchronous Operations
By default, the Win32 Internet functions operate synchronously. An application can request asynchronous operation by setting the INTERNET_FLAG_ASYNC flag in the call to the InternetOpen function. All future calls made against handles derived from the handle returned from InternetOpen will be made asynchronously.

The rationale for asynchronous versus synchronous operation is to allow a single-threaded application to maximize its utilization of the CPU without having to wait for network I/O to complete. Therefore, depending on the request, the operation might complete synchronously or asynchronously. The application should check the return code. If a function returns FALSE or NULL, and GetLastError returns ERROR_IO_PENDING, the request has been made asynchronously, and the application will be called back with INTERNET_STATUS_REQUEST_COMPLETE when the function has completed.

To begin asynchronous operation, the application must set the INTERNET_FLAG_ASYNC flag in its call to InternetOpen. The application must then register a valid callback function, using InternetSetStatusCallback.

After a callback function is registered for a handle, all operations on that handle can generate status indications, provided that the context value that was supplied when the handle was created was not zero. Providing a zero context value forces an operation to complete synchronously, even though INTERNET_FLAG_ASYNC was specified in InternetOpen.

Status indications give the application feedback about the progress of network operations, such as resolving a host name, connecting to a server, and receiving data. Three special-purpose status indications can be made for a handle:

INTERNET_STATUS_HANDLE_CLOSING is the last status indication that is made for a handle.
INTERNET_STATUS_HANDLE_CREATED indicates when the handle is initially created.
INTERNET_STATUS_REQUEST_COMPLETE indicates an asynchronous operation has completed.
The application must check the INTERNET_ASYNC_RESULT structure to determine whether the operation succeeded or failed after receiving an INTERNET_STATUS_REQUEST_COMPLETE indication.

The following sample shows an example of a callback function and a call to InternetSetStatusCallback to register the function as the callback function.

Hide Example
void
CALLBACK
CInternet::InternetCallback(
HINTERNET hInternet,
DWORD dwcontext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
)
{

// Insert code here.

};

INTERNET_STATUS_CALLBACK dwISC;

dwISC = InternetSetStatusCallback( hInternet,
(INTERNET_STATUS_CALLBACK) InternetCallback);



--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
ilya333
Дата 24.1.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 22.1.2006

Репутация: нет
Всего: нет



То, что мелкософт обещает асинхронную работу нужных мне функций, это и так ясно. Сделал я то, что написано в MSDN. Только, почему-то, асинхронности как не было, так и нет (описанная мной функция InternetSetStatusCallback не срабатывает и процедура InternetStatusCallback остаётся не при делах). А ведь должно работать. Это первый гвоздь. Второй состоит в том, что многопоточность я ни разу не организовывал. По идее, при создании потоков нужно описывать триггеры, для их обработки делать диспетчера и синхронизировать все события с помощью симафоров. А это такой гемор.
Хочется как-то по-простому, по-домашнему, и чтобы работало.
PM MAIL   Вверх
SeregaLBN
Дата 26.1.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



http://kserg77.narod.ru/zip/HTTPConnector.zip

Это сообщение отредактировал(а) SeregaLBN - 27.4.2007, 18:01
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.