1 (изменено: Lencore228, 2022-06-22 15:42:23)

Тема: AHK: именные мьютексы, лок и анлок

Читал много статей про мьютексы, вникал в суть работы и вроде бы написал рабочие функции, но спустя время выяснилось, что они не работают.

Задача: синхронизировать потоки через именной мьютекс. Второй поток не должен начинать действовать, пока не получит мьютекс от первого потока.
Проблема: при каждом вызове функции lock() поток получает новый мьютекс, даже если мьютекс с таким же именем уже существует. Возможно, там каким-то образом включается рекурсия. Использую ahk v2 (h)

Код:

lock(name)
{
   mutex := DllCall("OpenMutex", "UInt", 0x00100000, "Int", null, "Str", name)
   if ( mutex > 0 )
   {
      result := GetAccess(mutex)
      return mutex
   }
   else
   {
      mutex := DllCall("CreateMutex", "UInt", 0, "UInt", 0, "Str", name)
      result := GetAccess(mutex)
      return mutex
   }

}

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

unlock(mutex) 
{
   return DllCall("ReleaseMutex", "UInt", mutex)
}

Как это выглядит в рабочем коде:


mutex := lock('some_name')
; some code...
unlock(mutex)

Как сделать функции рабочими?

2

Re: AHK: именные мьютексы, лок и анлок

Советую задать вопрос на англоязычном форуме в разделе v2, и то шанс получить ответ, думаю, будет небольшим.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder