<?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>http://forum.script-coding.com/viewtopic.php?id=13036</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=13036&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Функция "Пауза" (замена команды sleep)».]]></description>
		<lastBuildDate>Mon, 02 Oct 2017 21:50:51 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119727#p119727</link>
			<description><![CDATA[<p>Доброго времени суток . Подскажите пожалуйста как можно переделать этот скрипт со &quot;sleep&quot; на &quot;Pause&quot;. А то получается скорость движения мыши теряется (в файле *.amc порядка 1750 строк ) после 15 секунды выполнения макроса. Файл *.amc это макрос от мышки X7. Подробное описание <a href="http://forum.script-coding.com/viewtopic.php?id=11767/">тут</a> .<br /></p><div class="codebox"><pre><code>Arr := []


#SingleInstance force
#Persistent
#NoEnv
SendMode Input
SetBatchLines, -1
CoordMode,Mouse
#MaxHotkeysPerInterval
#HotkeyInterval, -1


*~vk5B::


FileSelectFile, SelectedFile, 24, , Загрузить макрос, *.amc
text := FileOpen(SelectedFile,&quot;r&quot;).Read()


 While pEx := RegExMatch(text , &quot;O)MoveR (?&lt;x&gt;-?\d+) (?&lt;y&gt;-?\d+)(?:`r`n)?Delay (?&lt;Delay&gt;-?\d+) ms&quot;, match, pEx ? pEx : 1) + StrLen(match.0)
 
	 Arr.Insert(match)


return




~vk79::  ; выход
Suspend, Off
ExitApp
return



~vk78::
Suspend, toggle
return



*~vk47:: ; G - 
 KeyWait, LButton
Suspend, On
KeyWait, LButton, D
 Suspend, Off
return

*~WheelDown::
on := 0
 return

*~vk51::  ; Q 
on := 0
return

*~WheelUp:: 
on := 1

Suspend, Off

	
#if on
	
*~LButton::
for i,k in Arr

	{



if !GetKeyState(&quot;LButton&quot;,&quot;p&quot;)

			Return

DllCall(&quot;mouse_event&quot;, Uint, 1, int, k.x, int, k.y)
Sleep, % k.Delay

}
Return
#if</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Mon, 02 Oct 2017 21:50:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119727#p119727</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119725#p119725</link>
			<description><![CDATA[<p>Это ваш цикл из предыдущего сообщения, переписанный так, что:<br /></p><div class="quotebox"><cite>Странникх пишет:</cite><blockquote><p>подобно команде sleep, не влиять глобально задержкой на скрипт</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Mon, 02 Oct 2017 21:20:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119725#p119725</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119719#p119719</link>
			<description><![CDATA[<p><strong>stealzy</strong>, не понял, а что это иллюстрирует?</p>]]></description>
			<author><![CDATA[null@example.com (Странникх)]]></author>
			<pubDate>Mon, 02 Oct 2017 20:11:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119719#p119719</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119715#p119715</link>
			<description><![CDATA[<p><strong>Странникх</strong>, последняя попытка достучаться:<br /></p><div class="codebox"><pre><code>#Persistent
1Move:
MouseMove, 10, 20
SetTimer 2Move, -5000
Return

2Move:
MouseMove, 10, 120
SetTimer 3Move, -5000
Return

3Move:
MouseMove, 10, 240
SetTimer 1Move, -1
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Mon, 02 Oct 2017 19:15:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119715#p119715</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119712#p119712</link>
			<description><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Странникх, если вы еще не поняли код ahk исполняется не параллельно, поэтому Sleep будет суммироваться.</p></blockquote></div><p>Не параллельно, но действия из цикла Loop и SetTimer, например на кликер мышки, могут наложиться на друг друга.</p><p><strong>Alectric</strong>, в вашем примере цикл крутится, только условия строчки исполняются заданными таймерами. </p><p>Нужна <strong>пауза на строчку в блоке</strong> или <strong>в какой-либо части кода</strong>, подобно команде sleep, но не влиять глобально задержкой на скрипт.<br />Имеется в виду:<br /></p><div class="codebox"><pre><code>
SetTimer, Timer, On
Loop
{
MouseMove, 10, 20
Pause(5000)
MouseMove, 10, 120
Pause(5000)
MouseMove, 10, 240
}
Return

Timer:
MouseMove, 10, 10
Pause(1000)
MouseMove, 20, 10
Pause(1000)
MouseMove, 30, 10
Return
</code></pre></div><p>Используя sleep в этих циклах, задержки суммируются и движения мышки идут волоча за собой прибавку каждой задержки.<br />Есть способ избежать, но выглядит геморно, да и не под все задачи подходит. Вне sleep таймер запускается по расписанию, на него никак sleep не влияет.<br /></p><div class="codebox"><pre><code>
o_Clicker := [ {key:L, x:10, y:10, count:1, speed:2}
			 , {key:L, x:20, y:10, count:1, speed:2}
			 , {key:L, x:30, y:10, count:1, speed:2}
			 , {key:L, x:40, y:10, count:1, speed:2}
			 , {key:L, x:50, y:10, count:1, speed:2}
			 , {key:L, x:60, y:10, count:1, speed:2}
			 , {key:L, x:70, y:10, count:1, speed:2}
			 , {key:L, x:80, y:10, count:1, speed:2}
			 , {key:L, x:90, y:10, count:1, speed:2}
			 , {key:L, x:100, y:10, count:1, speed:2}
			 , {key:L, x:110, y:10, count:1, speed:2}
			 , {key:L, x:120, y:10, count:1, speed:2}
			 , {key:L, x:130, y:10, count:1, speed:2} ]
Loop
{
MouseMove, 10, 20
sleep, 5000
MouseMove, 10, 120
sleep, 5000
MouseMove, 10, 240
sleep, 5000
}
Return
Clicker:
i_Clicker++
If (i_Clicker &gt; o_Clicker.MaxIndex())
	i_Clicker = 1
MouseClick, % o_Clicker[i_Clicker].key, % o_Clicker[i_Clicker].x, % o_Clicker[i_Clicker].y, % o_Clicker[i_Clicker].count
Return
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Странникх)]]></author>
			<pubDate>Mon, 02 Oct 2017 18:41:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119712#p119712</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119711#p119711</link>
			<description><![CDATA[<p>Nice try, but no. Замеры времени в вашей ф-ии в первом наброске производятся в цикле, а значит приходим опять же к ограничению на один действующий цикл.<br />Следующие два примера демонстрируют убегание от проблемы путем запихивания всего в один цикл.</p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Mon, 02 Oct 2017 18:24:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119711#p119711</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119707#p119707</link>
			<description><![CDATA[<div class="codebox"><pre><code>start:=a_tickcount

Loop
{
  tooltip,% a_tickcount-start
  if Pause(10000)
    continue
  MsgBox, Я появился после паузы!
}
Return



Pause(t)
{
  static timer,oCT
  CycleTime:=a_tickcount-oCT
  oCT:=a_tickcount
  timer+=CycleTime
  if (timer&lt;t)
    return 1
  else
    timer=0
  return 0
}
</code></pre></div><div class="codebox"><pre><code>start:=a_tickcount

Loop
{
  CycleTime:=oldCycleTime!=&quot;&quot; ? a_tickcount-oldCycleTime : 0
  oldCycleTime:=a_tickcount

  tooltip,% a_tickcount-start



  if (!PeriodicTimer:=PeriodicTimer&gt;5000 ? 0 : PeriodicTimer=&quot;&quot; ? 1 : PeriodicTimer+CycleTime)
  {
    MsgBox, Я появился после паузы!
  }



  if (!AnotherPeriodicTimer:=AnotherPeriodicTimer&gt;17000 ? 0 : AnotherPeriodicTimer=&quot;&quot; ? 1 : AnotherPeriodicTimer+CycleTime)
  {
    MsgBox, Я появился после другой паузы!
  }
}
Return
</code></pre></div><div class="codebox"><pre><code>start:=a_tickcount

Loop
{
  CycleTime:=oldCycleTime!=&quot;&quot; ? a_tickcount-oldCycleTime : 0
  oldCycleTime:=a_tickcount

  tooltip,% a_tickcount-start &quot;`n&quot; PeriodicTimer &quot;`n&quot; AnotherPeriodicTimer


  if dofirst
  if (!PeriodicTimer:=PeriodicTimer&gt;5000 ? 0 : PeriodicTimer=&quot;&quot; ? 1 : PeriodicTimer+CycleTime)
  {
    PeriodicTimer=
    dofirst=
    MsgBox, Я появился после паузы!
  }


  if dosecond
  if (!AnotherPeriodicTimer:=AnotherPeriodicTimer&gt;17000 ? 0 : AnotherPeriodicTimer=&quot;&quot; ? 1 : AnotherPeriodicTimer+CycleTime)
  {
    AnotherPeriodicTimer=
    dosecond=
    MsgBox, Я появился после другой паузы!
  }
}
Return


1::dofirst=1

2::dosecond=1

</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Mon, 02 Oct 2017 17:42:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119707#p119707</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119702#p119702</link>
			<description><![CDATA[<p>А, я не понял, значит.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 02 Oct 2017 17:16:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119702#p119702</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119700#p119700</link>
			<description><![CDATA[<p><strong>Странникх</strong>, если вы еще не поняли код ahk исполняется <em>не параллельно</em>, поэтому Sleep будет суммироваться.<br />Вот я и предлагаю вам заменить <em>цикл со Sleep</em> на <em>SetTimer, МеткаИлиФункцияПослеЗадержки, % &quot;-&quot; задержка_мс</em>.<br /></p><div class="quotebox"><cite>Странникх пишет:</cite><blockquote><p>а если у нас конструкция бесконечного цикла и горячей клавиши.</p></blockquote></div><p>В вашем примере задержка по ГК бессмысленна, поскольку после нее сразу происходит возврат. Если же там предполагаются действия, то вы можете использовать SetTimer.<br />Если у вас только один поток крутит цикл и использует Sleep - проблем не будет, хотя и тут можно обойтись без.</p><p><strong>teadrinker</strong>, если это был не сарказм, то ТС нужно ровно наоборот — пауза, во время которой исполняется код других &quot;потоков&quot; <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.<br />Вот только переписать SetTimer в виде ф-ии Pause() не получится, поскольку SetTimer должен явно указывать на лейбл или ф-ию, с которой начнется выполнение кода после задержки.</p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Mon, 02 Oct 2017 17:06:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119700#p119700</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119687#p119687</link>
			<description><![CDATA[<div class="codebox"><pre><code>MyPause(delay)  {
   Thread, NoTimers
   Sleep, delay
   Thread, NoTimers, false
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 02 Oct 2017 15:39:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119687#p119687</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119658#p119658</link>
			<description><![CDATA[<p><strong>stealzy</strong>, а если у нас конструкция бесконечного цикла и горячей клавиши. <br /></p><div class="codebox"><pre><code>Loop
{
ToolTip, Loop
sleep, 2000
}
Return

1::
ToolTip, 1
sleep, 1000
Return
</code></pre></div><p>Разве, указав и запустив оба sleep, они не влияют на друг друга - то есть не прибавляют задержки, не важно в каких частях кода они вставлены? Если влияют, тогда функция паузы разделяет и не суммирует их задержки и пригодится хотя бы в циклах.</p><p>Вот пример, они суммируются <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="codebox"><pre><code>SetTimer, Label, On
Loop
{
	s1 := A_TickCount
	sleep, 1000
	ToolTip, % A_TickCount - s1 &quot; `n `n &quot; A_TickCount - s2
}
Return

Label:
	s2 := A_TickCount
	sleep, 2000
	ToolTip, % A_TickCount - s1 &quot; `n `n &quot; A_TickCount - s2
Return</code></pre></div><p>Хотя мой код с паузой я посмотрел тоже не помогает. Sleep и туда вползает, и в итоге увеличивает время в цикле Loop все равно. Видимо разбить на разные независимые задержки нельзя.</p>]]></description>
			<author><![CDATA[null@example.com (Странникх)]]></author>
			<pubDate>Sun, 01 Oct 2017 22:34:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119658#p119658</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119655#p119655</link>
			<description><![CDATA[<div class="quotebox"><cite>Странникх пишет:</cite><blockquote><p>При этом работают команды SetTimer, которые не засыпают как в случае с командой sleep</p></blockquote></div><div class="codebox"><pre><code>#Persistent
SetTimer Test, -2000
Sleep 5000
ToolTip Sleep, 100, 200, 1
Return

Test() {
	ToolTip Timer, 200, 200, 2
}</code></pre></div><p>Все ровно наоборот — таймеры работают во время Sleep, в отличии от циклов (не пытайтесь тестировать это с помощью MsgBox ввиду ограничений самого MsgBox).<br />Ваша ф-ия паузы использует цикл, а рабочий цикл в ahk возможен только один, предыдущий цикл останавливается на время работы последнего.<br /></p><div class="codebox"><pre><code>y:=0, x:=0

1::
	Loop {
		ToolTip % ++y, 200, 200, 1
		Sleep 500
	}

2::
	Loop {
		ToolTip % ++x, 100, 100, 2
		Sleep 500
	}</code></pre></div><div class="codebox"><pre><code>global x:=0, y:=0, i:=false, j:=false

1::
	i := !i
	SetTimer Loop_1, -1
	Return
2::
	j := !j
	SetTimer Loop_2, -1
	Return

Loop_1() {
	While i {
		ToolTip % ++x, 300, 200, 1
		Sleep 500
	}
}
Loop_2() {
	While j {
		ToolTip % ++y, 400, 200, 2
		Sleep 500
	}
}</code></pre></div><p>Вопрос - зачем вам нужна эта странная функция Pause?</p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Sun, 01 Oct 2017 18:47:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119655#p119655</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119653#p119653</link>
			<description><![CDATA[<p>AutoHotKey - язык, который не поддерживает многопоточность. Сожалею <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (MandarinKa02)]]></author>
			<pubDate>Sun, 01 Oct 2017 17:15:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119653#p119653</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Функция "Пауза" (замена команды sleep)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=119651#p119651</link>
			<description><![CDATA[<div class="codebox"><pre><code>1::
s1 := A_TickCount
Pause(2000)
ToolTip, % A_TickCount - s1
Return

2::
s2 := A_TickCount
Pause(3000)
ToolTip, % A_TickCount - s2
Return

Pause(wait) {
	CurrentTimePC := A_TickCount
	While ((A_TickCount - CurrentTimePC) &lt; wait)
		Continue
}
</code></pre></div><p>Для одного потока работает хорошо, например, в конструкции:<br /></p><div class="codebox"><pre><code>Loop
{
Pause(5000)
MsgBox, Я появился после паузы!
}
Return</code></pre></div><p>При этом работают команды SetTimer, которые не засыпают как в случае с командой sleep. Даже если почему-то вызывать функцию сначала с большим значением в ее параметре, а следом поменьше, то тоже работает, но если наоборот - уже нет.</p><p>Но интересует многофункциональность данной функции, чтобы ее можно было бы вставить в любую строчку кода, где дальше не читать строки пока функция не дойдет до конца своей работы (таймера ожидания).</p><p>Попробовал через массивы, но как-то разбить не получается. А у вас какие идеи?</p>]]></description>
			<author><![CDATA[null@example.com (Странникх)]]></author>
			<pubDate>Sun, 01 Oct 2017 16:47:10 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=119651#p119651</guid>
		</item>
	</channel>
</rss>
