<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: именные мьютексы, лок и анлок]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=17201</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17201&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: именные мьютексы, лок и анлок».]]></description>
		<lastBuildDate>Wed, 22 Jun 2022 13:21:01 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: именные мьютексы, лок и анлок]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=153635#p153635</link>
			<description><![CDATA[<p>Советую задать вопрос на англоязычном форуме в разделе v2, и то шанс получить ответ, думаю, будет небольшим.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 22 Jun 2022 13:21:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=153635#p153635</guid>
		</item>
		<item>
			<title><![CDATA[AHK: именные мьютексы, лок и анлок]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=153634#p153634</link>
			<description><![CDATA[<p>Читал много статей про мьютексы, вникал в суть работы и вроде бы написал рабочие функции, но спустя время выяснилось, что они не работают.</p><p>Задача: синхронизировать потоки через именной мьютекс. Второй поток не должен начинать действовать, пока не получит мьютекс от первого потока.<br />Проблема: при каждом вызове функции lock() поток получает новый мьютекс, даже если мьютекс с таким же именем уже существует. Возможно, там каким-то образом включается рекурсия. Использую ahk v2 (h)</p><p>Код:<br /></p><div class="codebox"><pre><code>lock(name)
{
   mutex := DllCall(&quot;OpenMutex&quot;, &quot;UInt&quot;, 0x00100000, &quot;Int&quot;, null, &quot;Str&quot;, name)
   if ( mutex &gt; 0 )
   {
      result := GetAccess(mutex)
      return mutex
   }
   else
   {
      mutex := DllCall(&quot;CreateMutex&quot;, &quot;UInt&quot;, 0, &quot;UInt&quot;, 0, &quot;Str&quot;, name)
      result := GetAccess(mutex)
      return mutex
   }

}

GetAccess(mutex, timeoutms:=0xbb8) 
{
   loop 10
   {
      result := DllCall(&quot;WaitForSingleObject&quot;, &quot;UInt&quot;, mutex, &quot;UInt&quot;, timeoutms)
      if ( result != 0)
      {
         return result
      }
   }
   return &quot;ERROR&quot;
   
}

unlock(mutex) 
{
   return DllCall(&quot;ReleaseMutex&quot;, &quot;UInt&quot;, mutex)
}</code></pre></div><p>Как это выглядит в рабочем коде:</p><div class="codebox"><pre><code>
mutex := lock(&#039;some_name&#039;)
; some code...
unlock(mutex)
</code></pre></div><p>Как сделать функции рабочими?</p>]]></description>
			<author><![CDATA[null@example.com (Lencore228)]]></author>
			<pubDate>Wed, 22 Jun 2022 11:31:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=153634#p153634</guid>
		</item>
	</channel>
</rss>
