<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6877</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6877&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «HTA+VBS: Множественные асинхронные запросы WinHttpRequest».]]></description>
		<lastBuildDate>Tue, 06 Mar 2012 10:54:18 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57562#p57562</link>
			<description><![CDATA[<p>Захотелось всё таки более подробно ответить... )</p><p><strong>2 mikser:</strong><br /></p><div class="quotebox"><cite>mikser пишет:</cite><blockquote><p>В серьёзных проектах использование сет интервала&nbsp; ничего хорошего не сулит.<br />Так например при 100 параллельных запросах, тормозит интерфейс скроллбары могут в любой момент перестать двигаться, кнопки&nbsp; не сразу нажимаются. Ядро процессора загружено на 100%. Несерьёзно это. Нельзя использовать сетинтервал для опроса а не изменилась ли переменная. Это приводит к тормозам. Надо искать другой способ.</p></blockquote></div><p>Не знаю как у Вас, но я подгрузил список из 3055 прокси серверов. Запустил на тест. Никаких тормозов и загрузки процессора не наблюдаю. У меня слишком мощный комп ? Не думаю. Рядовая двухядерная машинка Core 2 Duo, которая стоит у многих дома. Да, загрузка проца определённо есть. до 20-30% у меня скачки были. но это вполне терпимо, как мне кажется.</p><div class="quotebox"><cite>mikser пишет:</cite><blockquote><p>Ваша новация заключается в том что бы спрятать сетинтервал внутрь класса, но инкапсуляция которая безусловно наводит красоту в коде, не отменяет того&nbsp; факта что код в котором юзается сет интервал для опроса переменной&nbsp; приводит к тормозам. На деле к жутчайшим тормозам.</p></blockquote></div><p>Тормоза возникают в случае кривокодописания. ) Не отрицаю, что мой первый пример был именно таким. Я экспериментировал с разными способами обработки событий.</p><div class="quotebox"><cite>mikser пишет:</cite><blockquote><p>Предлагаю всем нашим коммьюнити признать что WinHttpReques.5.1 плохо реализован, и нуждается в доработке, а также выразить&nbsp; публичное ФИ Майкрософту <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" />,&nbsp; почему нельзя из скриптовых языков цепляться за события винхттп реквеста?</p></blockquote></div><p>Ммм. ) Флаг в руки. Согласен, что мелкомягкие могли бы наладить обработку событий для WinHttpRequest в скриптах. Но раз они этого не сделали ни в XP, ни в Vista, ни Win 7 и думаю в Win 8 тоже не сделают, то значит на это были какие то причины. )</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Tue, 06 Mar 2012 10:54:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57562#p57562</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57560#p57560</link>
			<description><![CDATA[<p><strong>2 DnsIs:</strong> Для того чтобы обрабатывать запросы к нескольким URL одновременно.</p><p>Решил собрать пример максимально просто. Без проверок на содержимое подгружаемого файла. Дабы не загружать код.<br /><span class="postimg"><img src="http://dc132.file.qip.ru/img/kZMmzcVJ/s7/0.7783681950517776/proxychecker.gif" alt="http://dc132.file.qip.ru/img/kZMmzcVJ/s7/0.7783681950517776/proxychecker.gif" /></span></p><p><strong>proxychecker.hta</strong><br /></p><div class="codebox"><pre><code>
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;windows-1251&quot;&gt;
        &lt;style&gt;
        *{font-family:Tahoma;font-size:12px;}
        &lt;/style&gt;
        &lt;title&gt;PROXY CHECKER&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;object id=HtmlDlgHelper classid=&quot;clsid:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B&quot; style=&quot;width:0;height:0;&quot;&gt;&lt;/object&gt;
        url: &lt;input id=&quot;inpUrl&quot; size=30 value=&quot;http://www.yandex.ru&quot;&gt;
        &lt;br&gt;&lt;br&gt;
        &lt;button id=&quot;btnLoadProxyList&quot;&gt;Загрузить список прокси&lt;/button&gt;
        &amp;nbsp;
        &lt;button id=&quot;btnStartCheck&quot;&gt;Запустить&lt;/button&gt;
        &amp;nbsp;
        &lt;button id=&quot;btnStopCheck&quot; disabled&gt;Остановить&lt;/button&gt;
        &lt;hr&gt;
        &lt;div id=&quot;ProxyListContainer&quot;&gt;
            &lt;table id=&quot;tblProxyList&quot;&gt;
                &lt;thead&gt;
                    &lt;tr&gt;
                    &lt;th&gt;№&lt;/th&gt;
                    &lt;th&gt;Прокси&lt;/th&gt;
                    &lt;th&gt;Статус&lt;/th&gt;
                    &lt;/tr&gt;
                &lt;/thead&gt;
                &lt;tbody&gt;
                &lt;/tbody&gt;
            &lt;/table&gt;
        &lt;/div&gt;
        &lt;script language=&quot;vbscript&quot;&gt;
        Option Explicit
        
        Dim FileSystemObject, TextStream, Dictionary, timerID, tBody, ExitScan
        Set FileSystemObject = CreateObject(&quot;Scripting.FileSystemObject&quot;)
        Set Dictionary = CreateObject(&quot;Scripting.Dictionary&quot;)
        Set tBody = tblProxyList.TBodies(0)

        &#039;Событие нажатие на кнопку загрузки файла
        Sub btnLoadProxyList_onclick()
            Dim FileName, TextLine, n
            &#039;Используем объект HtmlDlgHelper для выбора файла
            FileName = HtmlDlgHelper.openfiledlg(&quot;&quot;,&quot;&quot;,&quot;proxy list (*.txt)|*.txt|Все файлы (*.*)|*.*|&quot;,&quot;Выберите файл...&quot;)
            if FileName = &quot;&quot; Then Exit Sub
            &#039;Открываем файл на чтение
            Set TextStream = FileSystemObject.OpenTextFile(FileName,1,False)
            &#039;Очищаем табличку со списком прокси серверов
            Do While tBody.rows.length &gt; 0
               tBody.deleteRow
            Loop
            &#039;Читаем строки и заполняем таблицу
            Do While Not TextStream.AtEndOfStream
                n = n + 1
                TextLine = TextStream.ReadLine
                With tBody.insertRow
                    &#039;Устанавливаем у строк таблицы идентификаторы типа row1, row2, row3. Для дальнейшей связки с ними
                    .id = &quot;row&quot; &amp; n
                    .insertCell.innerText = n &amp; &quot;.&quot;
                    .insertCell.innerText = TextLine
                    .insertCell.innerText = &quot;-&quot;
                End With
            Loop
        End Sub
        
        &#039;Событие нажатия на кнопку Start
        Sub btnStartCheck_onclick()
            Dim row
            if tBody.rows.length &lt;=0 Then Exit Sub
            &#039;Перебираем записи в таблице. Запускаем проверку прокси. В качестве параметра id передаём row.id,
            &#039;чтобы в событии окончания проверки знать с какой строкой таблицы нам работать
            For Each row in tBody.rows
                CheckProxy row.id, row.Cells(1).innerText, inpUrl.value
                row.Cells(2).innerText = &quot;-&quot;
            Next
            
            &#039;Отключаем нужные кнопки и включаем нужные
            btnStartCheck.disabled = True
            btnLoadProxyList.disabled = True
            inpUrl.disabled = True
            btnStopCheck.disabled = false
        End Sub
        
        &#039;Процедура инициализации проверки прокси
        Sub CheckProxy(id, ProxyServer, url)
            Dim WinHttpRequest
            Set WinHttpRequest = CreateObject(&quot;WinHttp.WinHttpRequest.5.1&quot;)
            &#039;Устанавливаем прокси
            WinHttpRequest.SetProxy 2, ProxyServer
            WinHttpRequest.Open &quot;GET&quot;, url, True
            WinHttpRequest.Send
            &#039;Получаем номер и описание ошибки, если они есть
            AttachEventMonitor id, WinHttpRequest
        End Sub
        
        &#039;Событие нажатия на кнопку остановки
        Sub btnStopCheck_onclick()
            &#039;Вызываем процедуру оконачания обработки, дабы не дублировать код включения кнопок
            RequestsComplete
        End Sub
        
        &#039;Процедура добавления объектов запроса в коллекцию обработки
        Sub AttachEventMonitor(id, WinHttpRequest)
            Dictionary.Add id, WinHttpRequest
            if Dictionary.Count = 1 Then timerID = setInterval(&quot;WaitForResponse()&quot;,100)
        End Sub
        
        &#039;Процедура ожидания ответа от серверов
        Sub WaitForResponse()
            Dim Key, Status, ErrorNumber, ErrorDescription
            For Each Key in Dictionary.Keys
                On Error Resume Next
                if Dictionary(Key).WaitForResponse(0) = True Then
                    ErrorNumber = Err.number
                    ErrorDescription = Err.Description
                    On Error Goto 0

                    if ErrorNumber &lt;&gt; 0 Then
                        OnProxyCheckError Key, ErrorNumber, ErrorDescription
                    Else
                        OnProxyChecked Key, Dictionary(Key).Status, Dictionary(Key).StatusText
                    End if
                    Dictionary.Remove Key
                    &#039;Если таймер остановлен, а цикл ещё продолжает итерации, то выходим из процедуры
                    if timerID = 0 Then Exit Sub
                    if Dictionary.Count &lt;=0 Then
                        RequestsComplete()
                    End if
                End if
            Next
        End Sub
       
        &#039;Событие ответа прокси
        Sub OnProxyChecked(id, Status, StatusText)
            document.getElementById(id).Cells(2).innerText = Status &amp; &quot; &quot; &amp; StatusText
        End Sub
        
        &#039;Событие ошибки ответа от прокси
        Sub OnProxyCheckError(id, ErrorNumber,ErrorDescription)
            document.getElementById(id).Cells(2).innerText = ErrorDescription
        End Sub
        
        &#039;Событие окончания обработки всех запросов
        Sub RequestsComplete()
            clearInterval timerID
            timerID = 0
            
            Dictionary.RemoveAll
            
            btnStartCheck.disabled = false
            btnLoadProxyList.disabled = false
            inpUrl.disabled = false
            btnStopCheck.disabled = true
            
            MsgBox &quot;Сканирование завершено&quot;, vbInformation, document.title
        End Sub
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre></div><p><strong>proxylist.txt</strong><br /></p><div class="codebox"><pre><code>207.241.164.68:80
212.26.44.98:80
64.34.197.103:8118
208.64.176.157:80
149.249.17.34:8080
80.81.159.21:80
80.81.159.21:8080
92.50.133.26:81
109.123.111.99:80
160.79.35.27:80
116.55.19.96:808
212.88.118.181:8080
121.192.32.221:808
93.78.125.33:8088
220.113.15.21:8080
59.175.137.122:3128
80.63.56.146:8118
209.88.88.40:80
93.166.121.107:8118
219.142.62.13:8080
211.144.20.13:8080
217.219.115.138:80</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Tue, 06 Mar 2012 10:34:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57560#p57560</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57553#p57553</link>
			<description><![CDATA[<p>А зачем для каждого URL-а создавать отдельный WinHttpRequest?</p><p>Если исходный код был на JS, покажите его пожалуйста.</p>]]></description>
			<author><![CDATA[null@example.com (DnsIs)]]></author>
			<pubDate>Tue, 06 Mar 2012 03:03:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57553#p57553</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57538#p57538</link>
			<description><![CDATA[<p>Хорошо, буду на работе, закину. )</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 05 Mar 2012 19:53:02 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57538#p57538</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57534#p57534</link>
			<description><![CDATA[<p><strong>Xameleon</strong> выложи пожалуйста, думаю очень пригодится</p>]]></description>
			<author><![CDATA[null@example.com (pad0nak)]]></author>
			<pubDate>Mon, 05 Mar 2012 17:54:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57534#p57534</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57337#p57337</link>
			<description><![CDATA[<p><strong>2 mikser + pad0nak</strong> Согласен ). Но к сожалению я это заметил только после создания порядка тысячи запросов. Видать комп достаточно мощный. ) Переписал весь код с использованием одно setInterval. При этом вполне приемлемо работает. Нет загрузки проца на 100%. Если будет нужно - потом выложу.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Wed, 29 Feb 2012 08:09:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57337#p57337</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57324#p57324</link>
			<description><![CDATA[<p>Игрушка для детей что бы поиграться. В серьёзных проектах использование сет интервала&nbsp; ничего хорошего не сулит.<br />Так например при 100 параллельных запросах, тормозит интерфейс скроллбары могут в любой момент перестать двигаться, кнопки&nbsp; не сразу нажимаются. Ядро процессора загружено на 100%. Несерьёзно это. Нельзя использовать сетинтервал для опроса а не изменилась ли переменная. Это приводит к тормозам. Надо искать другой способ.<br /></p><div class="quotebox"><blockquote><p>Но почему то тогда добиться нормальной асинхронности не удалось. Решил собрать примерчик с подобием Wrapper-а на событие WinHttpRequest.</p></blockquote></div><p>Вы просто не поняли JS скрипт который там выкладывали, именно с сетинтервалом. Или мы про разные темы говорим. Нормальной асинхронности там действительно не удалось достичь. Ваша новация заключается в том что бы спрятать сетинтервал внутрь класса, но инкапсуляция которая безусловно наводит красоту в коде, не отменяет того&nbsp; факта что код в котором юзается сет интервал для опроса переменной&nbsp; приводит к тормозам. На деле к жутчайшим тормозам.</p><p>Предлагаю всем нашим коммьюнити признать что WinHttpReques.5.1 плохо реализован, и нуждается в доработке, а также выразить&nbsp; публичное ФИ Майкрософту <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" />,&nbsp; почему нельзя из скриптовых языков цепляться за события винхттп реквеста?</p>]]></description>
			<author><![CDATA[null@example.com (mikser)]]></author>
			<pubDate>Wed, 29 Feb 2012 03:30:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57324#p57324</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57313#p57313</link>
			<description><![CDATA[<p><span class="bbu">За идею 5+</span>, но есть одно маленькое НО.<br />Затестив данный примерчик выявился маленький баг (а может и задумка автора), который заключается в том, что&nbsp; при запуске скрипт зацикливается на определённом УРЛе и начинает к нему долбиться с бешаными темпами, вешая всё на свете <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" /><br />Я, будучи в этой сфере магии и волшебства новичком, на свой страх и риск осмелился маленько подкрутить и повертеть сие творение и в строчке <strong>timerID = setInterval(Me,1)</strong> поменял интервал с 1 млс. на 100 и всё чудесно заработало.</p>]]></description>
			<author><![CDATA[null@example.com (pad0nak)]]></author>
			<pubDate>Tue, 28 Feb 2012 15:02:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57313#p57313</guid>
		</item>
		<item>
			<title><![CDATA[HTA+VBS: Множественные асинхронные запросы WinHttpRequest]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57301#p57301</link>
			<description><![CDATA[<p>Помню, когда то давно эта тема поднималась. Но почему то тогда добиться нормальной асинхронности не удалось. Решил собрать примерчик с подобием Wrapper-а на событие WinHttpRequest. Ну и поделиться с Вами.</p><p>файл <strong>WinHttpEventWrapper.hta</strong><br /></p><div class="codebox"><pre><code>
&lt;html&gt;
	&lt;head&gt;
		&lt;meta charset=&quot;Windows-1251&quot;&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;script language=vbscript&gt;
		
			Dim UrlArray, Url, WinHttpRequest, EventWrapper, StartTime
			
			&#039;Заполняем массив URL адресов
			
			StartTime = Now
			
			UrlArray = Array(&quot;http://www.ya.ru&quot;,&quot;http://www.google.ru&quot;,&quot;http://creep.ru&quot;,&quot;http://www.rambler.ru&quot;,&quot;http://creep.ru&quot;,&quot;http://yandex.ru&quot;,&quot;http://moskva.fm&quot;)
			
			&#039;Запускаем цикл перебора элементов массива
			For Each Url in UrlArray
				&#039;Создаём новый объект WinHttpRequest
				Set WinHttpRequest = CreateObject(&quot;WinHttp.WinHttpRequest.5.1&quot;)
				&#039;Создаём Wrapper обработки его события
				Set EventWrapper = New clsWinHttpEventWrapper
				&#039;Подключаем событие к нашей процедуре обработки
				Set EventWrapper.onResponseFinished = GetRef(&quot;WinHttpRequest_OnResponseFinished&quot;)
				&#039;Делаем HTTP запрос
				WinHttpRequest.Open &quot;GET&quot;, Url, True
				WinHttpRequest.Send()
				&#039;Запускаем обработчик события
				EventWrapper.CatchEvent WinHttpRequest
			Next
			
			&#039;Процедура события завершения запросов
			Sub WinHttpRequest_OnResponseFinished(EventObject)
				Dim Url, Status
				On Error Resume Next
				Url = EventObject.Option(1)
				Status = EventObject.Status
				On Error Goto 0
				document.body.innerHtml = document.body.innerHtml &amp; Url &amp; &quot; - &quot; &amp; Status &amp; &quot; - &quot; &amp; Second(Now-StartTime) &amp; &quot;с. &lt;br&gt;&quot;
			End Sub
			
			&#039;Класс Wrapper для асинхронной обработки запросов
			Class clsWinHttpEventWrapper
				Private timerID, whr, callback
				
				&#039;Метод для запуска отлова событий объекта
				Sub CatchEvent(WinHttpRequest)
					Set whr = WinHttpRequest
					&#039;Цепляем таймер к внешнему публичному свойству нашего класс модуля. Чтобы вызывать свойство onResponseFinished циклически
					timerID = setInterval(Me,1)
				End Sub
				
				&#039;Свойство которое опрашивается по таймеру. (Указание Default сделано для того чтобы сделать его доступным для передачи в setInterval) 
				Public Default Property Get onResponseFinished()
					On Error Resume Next
					&#039;Проверяем состояние объекта
					If whr.WaitForResponse(0) Then
						On Error Goto 0
						&#039;Если callback установлен, то вызываем его и передаём параметром ссылку на наш объект
						if isObject(callback) Then callback(whr)
						&#039;Останавливаем таймер
						clearInterval timerID
					End if
				End Property
				
				&#039;Свойство для установки callback
				Public Property Set onResponseFinished(ref)
					Set callback = ref
				End Property
				
			End Class
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;</code></pre></div><p>Результат работы скрипта у меня:</p><div class="quotebox"><blockquote><p>http://www.google.ru/ - 200 - 1с. <br />http://www.ya.ru/ - 200 - 1с. <br />http://creep.ru/ - 200 - 1с. <br />http://www.rambler.ru/ - 200 - 1с. <br />http://creep.ru/ - 200 - 1с. <br />http://www.yandex.ru/ - 200 - 1с. <br />http://www.moskva.fm/ - 200 - 2с.</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 27 Feb 2012 19:38:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57301#p57301</guid>
		</item>
	</channel>
</rss>
