<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Асинхронный ping]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6986</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6986&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Асинхронный ping».]]></description>
		<lastBuildDate>Fri, 23 Mar 2012 10:34:49 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58298#p58298</link>
			<description><![CDATA[<p>Тогда так.<br /></p><div class="codebox"><pre><code>x = --x;</code></pre></div><p>Ыыыыыыы. 8)</p>]]></description>
			<author><![CDATA[null@example.com (DnsIs)]]></author>
			<pubDate>Fri, 23 Mar 2012 10:34:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58298#p58298</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58297#p58297</link>
			<description><![CDATA[<div class="quotebox"><cite>DnsIs пишет:</cite><blockquote><p>Хотя странно, вроде бы у декремента (--) приоритет выше чем у равно</p></blockquote></div><p>Все верно, согласно приоритетам:<br /></p><div class="quotebox"><blockquote><p>1. взять значение переменой x<br />2. уменьшить x на единицу<br />3. сохранить значение из п.1 в переменной x</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 23 Mar 2012 10:26:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58297#p58297</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58295#p58295</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Влияет. См. <a href="http://script-coding.com/forum/viewtopic.php?pid=56658#p56658">сообщение №9</a></p><div class="codebox"><pre><code>
var x = 10;

x = x--;
alert(x);

x = (x--);
alert(x);</code></pre></div></blockquote></div><p>Это означает лишь то, что у меня в списке процессов [пошел смотреть, убивать]... висит 9 шт &quot;wscript.exe&quot;. А-ха-ха-ха-ха.</p><p>Хотя странно, вроде бы у декремента (--) приоритет выше чем у равно (=).</p><br /><p>В остальном конечно же вы правы.</p>]]></description>
			<author><![CDATA[null@example.com (DnsIs)]]></author>
			<pubDate>Fri, 23 Mar 2012 09:44:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58295#p58295</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58287#p58287</link>
			<description><![CDATA[<div class="quotebox"><cite>DnsIs пишет:</cite><blockquote><p>ngCount--;&nbsp; - Мой косяк, исправил уже потом. (хоть на выполнение кода и не влияет)</p></blockquote></div><p>Влияет. См. <a href="http://script-coding.com/forum/viewtopic.php?pid=56658#p56658">сообщение №9</a></p><div class="codebox"><pre><code>
var x = 10;

x = x--;
alert(x);

x = (x--);
alert(x);</code></pre></div><p>===========</p><div class="quotebox"><cite>DnsIs пишет:</cite><blockquote><p>Цикл while, я тоже обычно пишу как и вы, сделал &quot;do ... while...&quot;, что бы не отклонятся от оригинала (правда не знаю зачем это мне было нужно). Но вы помогли найти мне ошибку: просто &quot;while (lngCount = 0);&quot; меняем на &quot;while (lngCount);&quot; и все пашет.</p></blockquote></div><p>Ошибка не здесь. </p><div class="codebox"><pre><code>while (lngCount = 0);</code></pre></div><p>Это неверная запись оператора сравнения. <br /></p><div class="quotebox"><blockquote><p>// присваивание<br />a = b</p><p>// сравнение<br />a == b</p></blockquote></div><p>Надо было написать один из вариантов<br /></p><div class="codebox"><pre><code>while ( lngCount )

while ( lngCount != 0 )</code></pre></div><p>===========</p><div class="quotebox"><cite>DnsIs пишет:</cite><blockquote><p>Хотя после прочтения статьи, я начал писать все чаще вот так вот</p></blockquote></div><p>Выигрыш незначительный.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 23 Mar 2012 08:43:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58287#p58287</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58285#p58285</link>
			<description><![CDATA[<p>Преогромнейешее спасибо, Rumata.</p><p>Хосты [&quot;192.168.1.43&quot;, &quot;192.168.1.42&quot;], как раз это соседние компы, которые доступны.</p><p>lngCount--;&nbsp; - Мой косяк, исправил уже потом. (хоть на выполнение кода и не влияет).</p><p>Цикл while, я тоже обычно пишу как и вы, сделал &quot;do ... while...&quot;, что бы не отклонятся от оригинала (правда не знаю зачем это мне было нужно). Но вы помогли найти мне ошибку: просто &quot;while (lngCount = 0);&quot; меняем на &quot;while (lngCount);&quot; и все пашет.</p><p>И цикл &quot;for...in&quot;, стараюсь не применять, но все по той же непонятной причине, сделал как в оригинале, не понимая до конца как он работает.<br />Почитаю вашу статейку, пойму. Спасибо за труды. 8)<br />Хотя после прочтения <a href="http://www.jstoolbox.com/2008/03/25/optimizaciya-ciklov/">статьи</a>, я начал писать все чаще вот так вот:<br /></p><div class="codebox"><pre><code>for    (i = arrComputers.length; --i &gt;= 0;) {}</code></pre></div><p>Ну и рабочий код<br /></p><div class="codebox"><pre><code>/*    Массив адресов/имён опрашиваемых машин
    В принципе, можно получать из сетевого окружения, с контроллера домена
    или перебором доступных адресов подсети */
var i,
    arrComputers = [&quot;google.com&quot;, &quot;www.ru&quot;, &quot;localhost&quot;, &quot;test&quot;],
    lngCount = arrComputers.length,
    objSWbemServicesEx = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\\\.\\Root\\CIMV2&quot;),
    objSWbemSink = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;, &quot;Sink_&quot;);

for    (i = arrComputers.length; --i &gt;= 0;) {
/*   В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае
     сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит
     свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки)*/
    var objSWbemNamedValueSet = WScript.CreateObject(&quot;WbemScripting.SWbemNamedValueSet&quot;);
    objSWbemNamedValueSet.Add (&quot;HostName&quot;, arrComputers[i]);
    
    // Все запросы будут обрабатываться в единственной процедуре обработки
    objSWbemServicesEx.ExecQueryAsync (objSWbemSink, &quot;SELECT * FROM Win32_PingStatus where Address = &#039;&quot; + arrComputers[i] + &quot;&#039;&quot;, null, null, null, objSWbemNamedValueSet);
}

// Ожидаем, пока не будут обработаны все асинхронные запросы
while (lngCount) {
    WScript.Sleep (100);
} 

objSWbemSink.Cancel();
WScript.Quit();

/*=============================================================================
 Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
 будет возвращаться единственный объект, однако, в большинстве случаев запросы
 возвращают множество объектов)*/
function  Sink_OnObjectReady(objWbemObject, objWbemAsyncContext) {
    var strComputer = [],
        strComputer = objWbemAsyncContext.Item(&quot;HostName&quot;);
    if (!objWbemObject.StatusCode) {
        if (!objWbemObject.StatusCode) {
            WScript.Echo (strComputer + &quot;\tOn&quot; + &quot;\tResponse time: &quot; + objWbemObject.ResponseTime + &quot; ms&quot;);
        } else {
            WScript.Echo (strComputer +&quot;\tOff&quot; + &quot;\tStatus code: &quot; + objWbemObject.StatusCode);
        }
    } else {
        WScript.Echo (strComputer + &quot;\tNot found&quot;);
    }
}

/*=============================================================================
 Процедура, вызываемая при завершении асинхронной обработки*/
function Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext) {
    objWbemAsyncContext.DeleteAll();
    objWbemAsyncContext = &quot;&quot;;
     // Уменьшаем счётчик оставшегося числа асинхронных обработок
    lngCount--;
}</code></pre></div><p>Так что можно в коллекцию добавить, как JScript-вариант.</p>]]></description>
			<author><![CDATA[null@example.com (DnsIs)]]></author>
			<pubDate>Fri, 23 Mar 2012 07:23:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58285#p58285</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58283#p58283</link>
			<description><![CDATA[<div class="quotebox"><cite>DnsIs пишет:</cite><blockquote><p>И еще вопрос возник в процессе. Прототип ExecQueryAsync: &lt;...&gt; 5 параметров, но в исходном примере почему то 6</p></blockquote></div><p>Смотрите из раздела Scripting API Objects, например <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa393867%28v=vs.85%29.aspx">http://msdn.microsoft.com/en-us/library … 85%29.aspx</a><br /></p><div class="codebox"><pre><code>objWbemObjectSet = .ExecQueryAsync( _
  [ ByVal objWbemSink ], _
  ByVal strQuery, _
  [ ByVal strQueryLanguage ], _
  [ ByVal iFlags ], _
  [ ByVal objwbemNamedValueSet ], _
  [ ByVal objWbemAsyncContext ] _
)</code></pre></div><p>Вопрос на засыпку. В Вашем примере два хоста [&quot;192.168.1.43&quot;, &quot;192.168.1.42&quot;]. Вы проверяли их доступность той vbscript-программой? </p><p>Ну и вот! Я по мере возможности стараюсь обращать внимание коллег на серьезную ошибку, которую допускают многие vb-программисты - <strong>неправильное использование циклов с массивами</strong>. Здесь я развернуто расписал - <a href="http://script-coding.com/forum/viewtopic.php?id=6844">Javascript/JScript: правильное использование циклов for-in и for</a>. </p><p>Вот фрагменты программы, которых затронула правка. <br /></p><div class="codebox"><pre><code>
...
for (var i = 0; i &lt; arrComputers.length; i++) {
    var strComputer = arrComputers[i];
...
// Ожидаем, пока не будут обработаны все асинхронные запросы
while (lngCount) {
    WScript.Sleep (100);
}
...
    // Уменьшаем счётчик оставшегося числа асинхронных обработок
    lngCount--;
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 23 Mar 2012 06:22:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58283#p58283</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Асинхронный ping]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58276#p58276</link>
			<description><![CDATA[<p>Решил переложить <a href="http://forum.script-coding.com/viewtopic.php?id=3783">код</a>, на Jscript, столкнулся с трудностями.<br /></p><div class="codebox"><pre><code>/*
    Массив адресов/имён опрашиваемых машин
    В принципе, можно получать из сетевого окружения, с контроллера домена
    или перебором доступных адресов подсети */
var arrComputers = [&quot;192.168.1.43&quot;, &quot;192.168.1.42&quot;],
    lngCount = arrComputers.length,
    objSWbemServicesEx = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\\\.\\Root\\CIMV2&quot;),
    objSWbemSink = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;, &quot;Sink_&quot;);

for (strComputer in arrComputers) {
    /* В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае
     сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит
     свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки)*/
    var objSWbemNamedValueSet = WScript.CreateObject(&quot;WbemScripting.SWbemNamedValueSet&quot;);
    objSWbemNamedValueSet.Add (&quot;HostName&quot;, strComputer);
    
    // Все запросы будут обрабатываться в единственной процедуре обработки
    objSWbemServicesEx.ExecQueryAsync (objSWbemSink, &quot;SELECT * FROM Win32_PingStatus where Address = &#039;&quot; + strComputer + &quot;&#039;&quot;, null, null, null, objSWbemNamedValueSet);
}
// Ожидаем, пока не будут обработаны все асинхронные запросы
do {
    WScript.Sleep (100);
}
while (lngCount = 0);

objSWbemSink.Cancel();

WScript.Quit();

/*=============================================================================
 Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
 будет возвращаться единственный объект, однако, в большинстве случаев запросы
 возвращают множество объектов)*/
function  Sink_OnObjectReady(objWbemObject, objWbemAsyncContext) {
    strComputer = [];
    
    strComputer = objWbemAsyncContext.Item(&quot;HostName&quot;);
    
    if (!objWbemObject.StatusCode) {
        if (!objWbemObject.StatusCode) {
            WScript.Echo (strComputer + &quot;\tOn&quot; + &quot;\tResponse time: &quot; + objWbemObject.ResponseTime + &quot; ms&quot;);
        } else {
            WScript.Echo (strComputer +&quot;\tOff&quot; + &quot;\tStatus code: &quot; + objWbemObject.StatusCode);
        }
    } else {
        WScript.Echo (strComputer + &quot;\tNot found&quot;);
    }
}

/*=============================================================================
 Процедура, вызываемая при завершении асинхронной обработки*/
function Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext) {
    objWbemAsyncContext.DeleteAll();
    objWbemAsyncContext = &quot;&quot;;
    
    // Уменьшаем счётчик оставшегося числа асинхронных обработок
    lngCount = lngCount--;
}</code></pre></div><p>Че то не фурычит. Помогите исправить пожалуйста.<br />И еще вопрос возник в процессе. Прототип <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa392108%28v=vs.85%29.aspx">ExecQueryAsync</a>:<br /></p><div class="codebox"><pre><code>HRESULT ExecQueryAsync(
  [in]  const BSTR strQueryLanguage,
  [in]  const BSTR strQuery,
  [in]  long lFlags,
  [in]  IWbemContext *pCtx,
  [in]  IWbemObjectSink *pResponseHandler
);</code></pre></div><p>5 параметров, но в исходном примере почему то 6:<br /></p><div class="codebox"><pre><code>objSWbemServicesEx.ExecQueryAsync objSWbemSink, &quot;SELECT * FROM Win32_PingStatus WHERE ADDRESS = &#039;&quot; &amp; strComputer &amp; &quot;&#039;&quot;, , , , objSWbemNamedValueSet</code></pre></div><p>Я слепой, да?</p>]]></description>
			<author><![CDATA[null@example.com (DnsIs)]]></author>
			<pubDate>Fri, 23 Mar 2012 03:30:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58276#p58276</guid>
		</item>
	</channel>
</rss>
