<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: [псевдо]мультипоточность используя onreadystatechange ?]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=9428</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9428&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: [псевдо]мультипоточность используя onreadystatechange ?».]]></description>
		<lastBuildDate>Thu, 27 Mar 2014 17:43:45 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: [псевдо]мультипоточность используя onreadystatechange ?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81262#p81262</link>
			<description><![CDATA[<div class="quotebox"><cite>omegastripes пишет:</cite><blockquote><p>Кстати, интереснейшая альтернатива функции GetRef() - использовать объект Me экземпляра класса с объявленным дефолтным методом. Этож получается можно организовать коллбэк не только глобально объявленных процедур и функций, но и методов экземпляров класса, к которым GetRef доступа не имеет?</p></blockquote></div><p>Я думал никто не заметит ). Всё-таки &quot;спалился&quot;. Хотя в JS это реализуется ещё симпатичнее. )</p><p>Изначально идея была в проверке проксилиста на предмет &quot;живых&quot; прокси. Вот я и задумался как прицепить к &quot;<strong>безликому</strong>&quot; вызову <strong>onreadystatechange</strong> связь с вызывающим объектом.<br /></p><div class="codebox"><pre><code>
// Пустой лог
var sLog = &quot;&quot;

// Запускаем проверку прокси
checkProxy(&quot;64.14.41.42:80&quot;)
checkProxy(&quot;69.50.64.153:3128&quot;)
checkProxy(&quot;41.162.23.91:80&quot;)
checkProxy(&quot;211.103.210.38:8080&quot;)

// Ждём пока обработаются запросы
WScript.Sleep(1000);

WScript.Echo(&quot;Рабочие прокси сервера: \r\n\r\n&quot; + sLog);

function checkProxy(proxy){
    // Создание нового объекта проверки прокси
    var oPC = new proxyChecker()
    // Передача адреса прокси объекту
    oPC.proxy = proxy
    // Запуск проверки прокси
    oPC.check(proxy_onresponse)
}

// Процедура обратного вызова для proxyChecker-ов
function proxy_onresponse(oPC) {
    sLog += oPC.proxy + &quot;\r\n&quot;
}

function proxyChecker() {
    // Переменная для хранения ссылки на функцию обратного вызова
    var callback;
    // Переменная для передачи ссылки на себя в callback
    var me = this;
    // Создание объекта для отправки HTTP запросов
    var oHR = new ActiveXObject(&quot;MSXML2.ServerXMLHTTP.6.0&quot;);
    // Установка URL по умолчанию для проверки запроса
    this.url = &quot;http://www.com&quot;;

    // Установка обработчика состояний объекта запросов
    oHR.onreadystatechange = function(){
        // Если объект перешёл в состояние 2 - loading, значит ответ от прокси есть
        if (oHR.readyState == 2) {
            // Завершаем запрос
            oHR.abort();
            // Генерация события обратного вызова
            callback(me)
        }
    }

    // Функция отправки запроса для проверки прокси
    this.check = function(onresponse){
        // Сохранение ссылки на функцию обратного вызова
        callback = onresponse
        // Установка прокси сервера
        if (this.proxy == &#039;&#039;) oHR.setProxy(2, this.proxy);
        // Инициализация запроса через прокси
        oHR.open(&quot;HEAD&quot;, this.url, true);
        // Отправка запроса
        oHR.send();
    }
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 27 Mar 2014 17:43:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81262#p81262</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: [псевдо]мультипоточность используя onreadystatechange ?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81261#p81261</link>
			<description><![CDATA[<p>Я наблюдал следующее поведение скриптов, выполнявшихся в отдельных процессах: если расшарить Me одного скрипта нескольким другим, таким образом давая им доступ к его процедурам, то при вызове любой процедуры первого скрипта из контекста других, очередность выполнения реализуется в виде стека (первым пришел - последним ушел). Иными словами каждый новый скрипт, обратившийся к процедуре первого, прерывает выполнение первого скрипта и всех других, обратившихся до этого к первому. После завершения процедуры, вызванной последним скриптом, выполнение прерванных возобновляется в обратном порядке, по-очереди.</p><p>То есть даже выполняющиеся в независимых процессах скрипты не могут одновременно исполнять команды в контексте одного скрипта, а приостанавливают друг друга. Коллбэки, вероятнее всего поведут себя аналогично, тем более, что обратные вызовы исходят от объектов, созданных в контексте одного скрипта. </p><p>Кстати, интереснейшая альтернатива функции GetRef() - использовать объект Me экземпляра класса с объявленным дефолтным методом. Этож получается можно организовать коллбэк не только глобально объявленных процедур и функций, но и методов экземпляров класса, к которым GetRef доступа не имеет?</p>]]></description>
			<author><![CDATA[null@example.com (omegastripes)]]></author>
			<pubDate>Thu, 27 Mar 2014 17:41:22 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81261#p81261</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: [псевдо]мультипоточность используя onreadystatechange ?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81260#p81260</link>
			<description><![CDATA[<p>Ясно. Благодарю. Надо будет почитать про маршалинг.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 27 Mar 2014 17:02:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81260#p81260</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: [псевдо]мультипоточность используя onreadystatechange ?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81257#p81257</link>
			<description><![CDATA[<p>Не до конца понимаю, что делает ваш код, поэтому выскажу только общие соображения. У движка VBS потоковая модель — both, т.е. теоретически позволяет и многопоточность, но WScript его использует в однопоточном режиме. К функциям прямые вызовы из других потоков не проходят, а возможны только через маршаллинг, а это значит — в виде оконных сообщений. Т.е. они поступают в очередь сообщений того потока, где создан объект движка, и выполняются один за другим.</p><p>В процессе выполнения одного вызова в него может вклиниться другой, т.к. при вызове WScript.Sleep, видимо, проверяется очередь сообщений, и если там есть вызов другой функции, то начнёт выполняться он, а первый будет его ждать.</p><p>По крайней мере к таким выводам я пришёл по результатам экспериментов.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 27 Mar 2014 16:53:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81257#p81257</guid>
		</item>
		<item>
			<title><![CDATA[VBS: [псевдо]мультипоточность используя onreadystatechange ?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81255#p81255</link>
			<description><![CDATA[<p>Приветствую господа. Вроде уже эту тему вертели как могли, так что если я брежу, удалим это к чёрту.</p><p>Ковыряясь с onreadystatechage задумался о запуске кода параллельно.</p><p>Скажите, кто-нибудь так экспериментировал ? При этом ведь деления на потоки не происходит и обратные вызовы WScript всё равно ставит в очередь ?</p><div class="codebox"><pre><code>
Option Explicit

Dim s
Dim n

RunThread GetRef(&quot;Test1&quot;)
RunThread GetRef(&quot;Test2&quot;)
RunThread GetRef(&quot;Test3&quot;)

MsgBox &quot;Процедуры запущены !&quot;

Do While n &gt; 0
    WScript.Sleep 100
Loop

MsgBox s

Sub RunThread(oProc)
    Dim cThread
    Set cThread = New cThread
    cThread.Run oProc
    n = n + 1
End Sub

Sub Test1()
    WScript.Sleep 1000
    s = s &amp; &quot;Test1&quot; &amp; vbCrlf
    n = n - 1
End Sub

Sub Test2()
    WScript.Sleep 100
    s = s &amp; &quot;Test2&quot; &amp; vbCrlf
    n = n - 1
End Sub

Sub Test3()
    s = s &amp; &quot;Test3&quot; &amp; vbCrlf
    n = n - 1
End Sub

Class cThread
    Private oHR
    Private oCallback
    Private Sub Class_Initialize()
        Set oHR = CreateObject(&quot;MSXML2.XMLHTTP&quot;)
    End Sub
    
    Sub Run(oProc)
        Set oCallback = oProc
        oHR.onreadystatechange = Me
        oHR.Open &quot;HEAD&quot;, &quot;http://www.com&quot;, True
        oHR.send
    End Sub
    
    Public Default Sub oncallback()
        if oHR.readyState = 2 Then
            oCallback
        End if
    End Sub
End Class
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 27 Mar 2014 15:10:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81255#p81255</guid>
		</item>
	</channel>
</rss>
