![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| MadGod |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 30.9.2005 Репутация: нет Всего: нет |
Собственно, хотелось только узнать.. если я хочу качать файлы многопоточно.. то мне в каждом потоке надо исполнять InternetConnect или достаточно передать указатель возвращенный им, а создавать только запросы с помощью HttpOpenRequest?..
|
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
Вызывать InternetConnect нужно отдельно в каждом потоке (и вообщето после каждого запроса надо проверять не разорвалося ли соединение
|
|||
|
||||
| MadGod |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 30.9.2005 Репутация: нет Всего: нет |
Спасибо, ответ прочел давно... но к сожалению - забыл поблагодарить - извиняюсь!
|
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 3 Всего: 5 |
Ты монстр=)
-------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| ilya333 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 и заняться сокетами, или всё-таки это возможно? |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Во-первых, для заданного тобою вопроса, нужна отдельная тема.
Во-вторых, есть раздел "С++ Сети" В-третьих, для создания многопоточности используется совсем другой API, а не WinInet. В-четвертых, если хочешь, что бы тебе объяснили прогу на си, выложи ее сюда. (к стати, я знаю и паскаль, но от этого не возникло отвращения ни к одному из них Вобщем, желаю удачи в "изыскании резервов" |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 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!! |
|||
|
||||
| ilya333 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 22.1.2006 Репутация: нет Всего: нет |
То, что мелкософт обещает асинхронную работу нужных мне функций, это и так ясно. Сделал я то, что написано в MSDN. Только, почему-то, асинхронности как не было, так и нет (описанная мной функция InternetSetStatusCallback не срабатывает и процедура InternetStatusCallback остаётся не при делах). А ведь должно работать. Это первый гвоздь. Второй состоит в том, что многопоточность я ни разу не организовывал. По идее, при создании потоков нужно описывать триггеры, для их обработки делать диспетчера и синхронизировать все события с помощью симафоров. А это такой гемор.
Хочется как-то по-простому, по-домашнему, и чтобы работало. |
|||
|
||||
| SeregaLBN |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.10.2003 Где: Киев Репутация: нет Всего: нет |
http://kserg77.narod.ru/zip/HTTPConnector.zip
Это сообщение отредактировал(а) SeregaLBN - 27.4.2007, 18:01 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |