<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Альтернатива команды "sleep".]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=9362</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9362&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Альтернатива команды "sleep".».]]></description>
		<lastBuildDate>Fri, 21 Mar 2014 09:41:27 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81067#p81067</link>
			<description><![CDATA[<p>В том-то и волнующе-приятный цимус, что и без пресловутых &quot;точных счетчиков&quot; скрипт с использованием таймеров дает нужный результат, только с небольшими взаимокомпенсирующимися колебаниями продолжительности промежуточных периодов.<br />Я слишком далек от всего этого, чтобы быть уверенным, но похоже отсчет периодов SetTimer происходит с использованием именно (если правильно запомнил) аппаратного программируемого таймера, а разница в продолжительности периодов обусловлена квантованием, с которым SetTimer получает от него сведения о прошедшем времени. В хелпе АНК в статье про sleep есть скрипт, предназначенный для задания периодов меньших, чем квантование, как я понимаю, основанный на увеличении частоты аппаратного программируемого таймера или частоты получения системой от него сведений (трудно выражаться, не владея терминами <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> ). Так в примечании сказано, что на SetTimer, в отличие от всех приложений, этот метод влияния не оказывает.<br />Так что похоже, что для решения рассматриваемой задачи SetTimer вполне достаточно.</p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Fri, 21 Mar 2014 09:41:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81067#p81067</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81056#p81056</link>
			<description><![CDATA[<p>Вместо sleep и таймеров точными счетчиками пользоваться надо, вот тут ровно 30 щелчков за 30 секунд:</p><div class="codebox"><pre><code>
Process, Priority, , Realtime
SetBatchLines, -1
keepClicking := 0
DllCall(&quot;QueryPerformanceFrequency&quot;, &quot;Int64*&quot;, freQ)

Return

~Lbutton::
N :=
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64 *&quot;, t1)
keepClicking := 1
gosub MyLabel
Return

~Lbutton Up::
keepClicking := 0
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64 *&quot;, t2)
ToolTip, % N . &quot; щелчков за &quot;  (t2-t1)/freQ*1000 . &quot; мсек `r`n&quot; . 60*N/((t2 - t1)/freQ) . &quot; щелчков за минуту&quot;
Return

MyLabel:
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64 *&quot;, CounterBefore)
Click
N ++
Loop
{
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64 *&quot;, CounterAfter)
if (  (CounterAfter - CounterBefore)/freQ &gt;= 0.1)
break
}
if (keepClicking = 1)
GOSUB MyLabel
Return
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (skyman)]]></author>
			<pubDate>Fri, 21 Mar 2014 01:51:02 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81056#p81056</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80971#p80971</link>
			<description><![CDATA[<p>Это раскуроченный скрипт из поста #15.<br />По нажатию левой кнопки мыши он в течение минуты замеряет длительность периодов таймера и после истечения минуты вместе с другой информацией выдает продолжительность максимального и минимального&nbsp; периода.<br />Сначала, когда я пробовал этот скрипт ypppu у меня получались разные результаты, не отвечающие условиям. Но на следующий день сколько бы я его не гонял, получалось всегда требуемое количество кликов, причем очень точно.<br />Это меня заинтересовало в свете предыдущих изысканий и я стал измерять продолжительность периодов срабатывания таймера, поскольку в начальном виде скрипт выводил в конце только количество кликов и общее время.</p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Tue, 18 Mar 2014 17:30:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80971#p80971</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80959#p80959</link>
			<description><![CDATA[<div class="quotebox"><cite>многобанофф пишет:</cite><blockquote><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Дальнейшие копания привели вот к чему.</div><div class="fancy_spoiler"><div class="codebox"><pre><code>Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
DllCall(&quot;QueryPerformanceFrequency&quot;, &quot;Int64*&quot;, Frequency)
Return

Lbutton::
N :=
t1 := A_tickcount
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64*&quot;, CounterBefore)
SetTimer, MyLabel, ON
Return

MyLabel:
if (A_tickcount &gt; t1 + (1000 * 60))
    {
    SetTimer, MyLabel, OFF
    ToolTip, % N . &quot; щелчков за &quot; t2 - t1 . &quot; мсек `r`n&quot; . 60*N/((t2 - t1)/1000) 
    . &quot; щелчков за минуту `r`n&quot; . (CounterAfter - CounterBefore)/Frequency . &quot; точное время  `r`n&quot;
    . PeriodMax . &quot; &lt;-------&gt; &quot; . PeriodMin
    Return
    }
;Click
N ++
t2 := A_tickcount
CounterAfterOld := CounterAfter
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64*&quot;, CounterAfter)

Period :=(CounterAfter - CounterAfterOld)/Frequency
PeriodMin := !PeriodMin ? 0.1 : PeriodMin &gt; Period ? Period : PeriodMin
PeriodMax := !PeriodMax ? 0.1 : PeriodMax &lt; Period ? Period : PeriodMax

Return</code></pre></div></div></div></blockquote></div><p>Что это,как этим пользоваться? У меня рабоет - никак...</p>]]></description>
			<author><![CDATA[null@example.com (Gabe_#33)]]></author>
			<pubDate>Tue, 18 Mar 2014 13:49:37 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80959#p80959</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80896#p80896</link>
			<description><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>Вот с настройками 94. Конечно, я не робот, передержал кнопку на три десятых секунды. <br />Да, в кванты я лезть не готов, пока в этом не будет практической пользы.</p></blockquote></div><p>Действительно дает требуемое количество. Более того, не удалось воспроизвести ситуацию с лишним или недостающим кликом. То есть независимо от общего периода и прочих пришедших на ум условий. Почему у меня раньше были абсолютно другие результаты - ума не дам. Единственная разница - сейчас прописал в скрипт, а тогда нажимал вручную (может тачпад и его дрова?...).<br />Дальнейшие копания привели вот к чему.<br /></p><div class="codebox"><pre><code>Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
DllCall(&quot;QueryPerformanceFrequency&quot;, &quot;Int64*&quot;, Frequency)
Return

Lbutton::
N :=
t1 := A_tickcount
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64*&quot;, CounterBefore)
SetTimer, MyLabel, ON
Return

MyLabel:
if (A_tickcount &gt; t1 + (1000 * 60))
    {
    SetTimer, MyLabel, OFF
    ToolTip, % N . &quot; щелчков за &quot; t2 - t1 . &quot; мсек `r`n&quot; . 60*N/((t2 - t1)/1000) 
    . &quot; щелчков за минуту `r`n&quot; . (CounterAfter - CounterBefore)/Frequency . &quot; точное время  `r`n&quot;
    . PeriodMax . &quot; &lt;-------&gt; &quot; . PeriodMin
    Return
    }
;Click
N ++
t2 := A_tickcount
CounterAfterOld := CounterAfter
DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64*&quot;, CounterAfter)

Period :=(CounterAfter - CounterAfterOld)/Frequency
PeriodMin := !PeriodMin ? 0.1 : PeriodMin &gt; Period ? Period : PeriodMin
PeriodMax := !PeriodMax ? 0.1 : PeriodMax &lt; Period ? Period : PeriodMax

Return</code></pre></div><p>У меня дает реальную продолжительность периодов в пределах от 85 до 116 мс. Если большие периоды можно объяснить нагрузкой, то откуда меньшие?</p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Sun, 16 Mar 2014 18:36:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80896#p80896</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80892#p80892</link>
			<description><![CDATA[<p>Вот с настройками 94. Конечно, я не робот, передержал кнопку на три десятых секунды. <br />Да, в кванты я лезть не готов, пока в этом не будет практической пользы.</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Sun, 16 Mar 2014 14:37:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80892#p80892</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80890#p80890</link>
			<description><![CDATA[<p>Тупо зажал Enter и в мелькании разглядел 15,625. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Sun, 16 Mar 2014 13:42:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80890#p80890</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80888#p80888</link>
			<description><![CDATA[<p><a href="http://www.rsdn.ru/forum/winapi/4159851.1">Вот собственно, чем поделился гугл о таймерах (из наиболее доходчивого для меня лично).</a><br />А вот <a href="http://technet.microsoft.com/en-us/sysinternals/bb897568">это</a> должно бы ответить каждому на вопрос о частоте системного таймера его ПК, но у меня при запуске окно почему-то быстро исчезает, не разглядеть.</p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Sun, 16 Mar 2014 13:17:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80888#p80888</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80887#p80887</link>
			<description><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>В моём варианте 1 клик происходит каждые 100 мс. Если бы я задал 100, то число кликов начало бы отставать (точная причина мне неизвестна). Но я задал 94, чем компенсировал отставание. Теперь за минуту получается ровно 600 кликов.</p></blockquote></div><p>Я запускал Ваш скрипт и ни разу не видел 600 в минуту. Может как раз у вас квант 10?<br />Если не затруднит, запустите у себя в таком виде и напишите, что отображается в тултипе:<br /></p><div class="codebox"><pre><code>Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
Return

~Lbutton::
N :=
t1 := A_tickcount
SetTimer, MyLabel, ON
Return

~Lbutton Up::
SetTimer, MyLabel, OFF
t2 := A_tickcount
ToolTip, % N . &quot; щелчков за &quot; t2 - t1 . &quot; мсек `r`n&quot; . 60*N/((t2 - t1)/1000) . &quot; щелчков за минуту&quot;
Return

MyLabel:
ToolTip % A_tickcount - t3
t3 := A_tickcount
Click
N ++
Return</code></pre></div><p>У меня чередуются 94 и 109 (все из-за той же дробной части как я понимаю).<br />Потом попробуйте менять 94 на единицу в меньшую сторону, а затем в большую. В моем случае 93 и ниже до 79 включительно дает чередование 93/94, 95 и выше до 109 включительно дает 109/110. После преодоления этих порогов значение изменяется на 15 и т.д.</p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Sun, 16 Mar 2014 12:21:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80887#p80887</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80886#p80886</link>
			<description><![CDATA[<p>До сих пор представлял себе, что команда <em>SetTimer</em> связана с часами компьютера.</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Sun, 16 Mar 2014 11:37:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80886#p80886</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80884#p80884</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Кстати, в моей подпрограмме таймера просто щелчок ЛКМ и и увеличение переменной N на единицу. Возможно, это гораздо быстрее, чем прорисовать ToolTip.</p></blockquote></div><p>Ну так речь идёт про алгоритм выполнения действий через определённый отрезок времени, который не надо под каждый случай и пк подгонять. И если он не в состоянии вовремя отобразить тултип, или как в приведённой теме перерисовать часы (там кстати как раз 1000мс, и очень быстро становится видно что секунды сбиваются), то зачем использовать такой алгоритм, когда есть уже простое решение?</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 16 Mar 2014 11:06:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80884#p80884</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80882#p80882</link>
			<description><![CDATA[<p>Хм, тогда в коде должно быть <em>settimer, proc, <strong>100</strong></em>? В этом случае действительно две последние цифры прыгают, хотя не должны. А вот если задать <em>settimer, proc, <strong>1000</strong></em>, то уже все три цифры не прыгают.</p><p>Кстати, в моей подпрограмме таймера просто щелчок ЛКМ и и увеличение переменной N на единицу. Возможно, это гораздо быстрее, чем прорисовать ToolTip.</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Sun, 16 Mar 2014 10:25:43 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80882#p80882</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80880#p80880</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Не понял смысл теста.</p></blockquote></div><p>Если действие выполняется ровно каждые 100мс, то при старте мы увидим ну например 648 и далее должно быть 748, 848 и.т.д. Ок, первую цифру в учёт не берём и наблюдаем за 48. Пускай будет всегда плюс потом минус примерно 10 или даже 20 мс. Но по вашей теории, постоянно должно быть рядом с ~50. А на практике будет только смещение вперёд или назад.<br />Нельзя подобрать заранее точную задержку (тем более понимая, что в очередь команд (для процессора) процесса даже с высоким приоритетом, может всегда вмешатся система или такой же приоритетный процесс, что неминуемо приводит к увеличению времени исполнения), её нужно постоянно корректировать, и никакой дллкэлл или вычисления квантов тут не помогут, имхо конечно.</p><p>Ну и для наглядности теста, конечно нужно увеличить задержку до 300~500 мс.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 16 Mar 2014 09:21:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80880#p80880</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80879#p80879</link>
			<description><![CDATA[<div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p> Простейший тест:<br /></p><div class="codebox"><pre><code>
settimer, proc, 90
return

proc:
tooltip, % a_msec
return

</code></pre></div><p>По вашей логике (как я понял), подобрав значение таймера 100мс минус время выполнения команды тултип, мы должны видеть всегда примерно одно число.</p></blockquote></div><p>Не понял смысл теста.</p><br /><div class="quotebox"><cite>многобанофф пишет:</cite><blockquote><p>В Вашем варианте 1 клик происходит каждые 94 мс, то есть с 17-го клика пойдет накапливаемое расхождение с требуемым количеством.<br />А 94 - не потому, что Ваш компьютер &quot;съедает&quot; 6 мс, а потому что 94 это близко к значению, кратному 15,6 мс.</p></blockquote></div><p>В моём варианте 1 клик происходит каждые 100 мс. Если бы я задал 100, то число кликов начало бы отставать (точная причина мне неизвестна). Но я задал 94, чем компенсировал отставание. Теперь за минуту получается ровно 600 кликов.</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Sun, 16 Mar 2014 08:55:22 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80879#p80879</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Альтернатива команды "sleep".]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=80878#p80878</link>
			<description><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>А чем <a href="http://forum.script-coding.com/viewtopic.php?pid=80804#p80804">мой вариант</a> не устраивает? Как при бездействии, так и при 100% загрузке&nbsp; процессора один-в-один укладывается.</p></blockquote></div><p>В Вашем варианте 1 клик происходит каждые 94 мс, то есть с 17-го клика пойдет накапливаемое расхождение с требуемым количеством.<br />А 94 - не потому, что Ваш компьютер &quot;съедает&quot; 6 мс, а потому что 94 это близко к значению, кратному 15,6 мс. Именно квантом 15,6, как я понимаю, у всех отписавшихся оперирует система (в справке сказано - зависит от железа и дров). Поэтому задание временных параметров что для Sleep, что для SetTimer в промежутках между значениями, кратными 15,6 мс, по большому счету бессмысленно. 94 - как раз пороговое значение, при 95 фактический период становится близким 109 (при прогоне подряд меняется на единицу - видимо из-за дробной части у кванта). Такое же квантование и для A_tickcount, в чем нетрудно убедиться, замеряя время очень быстро выполняемых операций в цикле.</p>]]></description>
			<author><![CDATA[null@example.com (многобанофф)]]></author>
			<pubDate>Sun, 16 Mar 2014 08:25:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=80878#p80878</guid>
		</item>
	</channel>
</rss>
