Что нового

Как работать с Mutex?

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Никак не пойму как с ним работать, набросал утилиту с 3 кнопками, создать проверить и удалить.
Но удалить не работает? Почему после того как я нажимаю на удалить а затем проверить, все равно пишет что уже существует?
Мне это нужно, что бы как минимум 2 программы могли понимать, когда mutex с определенным именем занят или свободен.
Код:
#include <WinAPIProc.au3>
#include <WinAPI.au3>


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 290, 79, -1, Random(100, 500, 1))
$Label1 = GUICtrlCreateLabel("Мутекс имя:", 8, 6, 67, 17)
$Input1 = GUICtrlCreateInput("[868860008249466]", 8, 24, 193, 21)
$Button1 = GUICtrlCreateButton("Создать", 208, 0, 75, 25)
$Button2 = GUICtrlCreateButton("Проверить", 208, 24, 75, 25)
$Button3 = GUICtrlCreateButton("Удалить", 208, 48, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Global $hMutex


Local Const $ERROR_ALREADY_EXISTS = 183
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1 ;Создать
			$sName = GUICtrlRead($Input1)
			$hMutex = _WinAPI_CreateMutex ( $sName)
			If _WinAPI_GetLastError() = $ERROR_ALREADY_EXISTS Then
				MsgBox(0,$hMutex,'Уже существует')
				 _WinAPI_CloseHandle($hMutex)
			EndIf
		Case $Button2
			$sName = GUICtrlRead($Input1)
			$hMutex = _WinAPI_CreateMutex ( $sName)
			If _WinAPI_GetLastError() = $ERROR_ALREADY_EXISTS Then
				MsgBox(0,$hMutex,'Уже существует')
			Else
				MsgBox(0, '', 'Свободен')
			EndIf
			_WinAPI_ReleaseMutex ($hMutex)
			_WinAPI_CloseHandle($hMutex)

		Case $Button3
			_WinAPI_ReleaseMutex ($hMutex)
			 _WinAPI_CloseHandle($hMutex)
	EndSwitch
WEnd
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А все, кажется вот так нужно.
Код:
#include <WinAPIProc.au3>
#include <WinAPI.au3>


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 290, 79, -1, Random(100, 500, 1))
$Label1 = GUICtrlCreateLabel("Мутекс имя:", 8, 6, 67, 17)
$Input1 = GUICtrlCreateInput("[868860008249466]", 8, 24, 193, 21)
$Button1 = GUICtrlCreateButton("Создать", 208, 0, 75, 25)
$Button2 = GUICtrlCreateButton("Проверить", 208, 24, 75, 25)
$Button3 = GUICtrlCreateButton("Удалить", 208, 48, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;~ Global $hMutex
Global $MUTEX_H, $MUTEX_NAME

Local Const $ERROR_ALREADY_EXISTS = 183
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1 ;Создать
			$sName = GUICtrlRead($Input1)
			If mutex_create($sName) Then
				MsgBox(0,0,'Создан')
			Else
				MsgBox(0,0,'Не создан')
			EndIf
		Case $Button2
			If mutex_check(GUICtrlRead($Input1)) Then
				MsgBox(0,0,'Уже существует')
			Else
				MsgBox(0,0,'Свободен')
			EndIf
		Case $Button3
			mutex_release()
	EndSwitch
WEnd


Func mutex_create($sMutex)
	If $MUTEX_H Then
		MsgBox(0,0,'Сперва необходимо освободить старый')
		Return False
	EndIf
	Local $hMutex = _WinAPI_CreateMutex($sMutex)
	If _WinAPI_GetLastError() = $ERROR_ALREADY_EXISTS Then
		_WinAPI_ReleaseMutex ($hMutex)
		_WinAPI_CloseHandle($hMutex)
		Return False
	EndIf
	$MUTEX_H = $hMutex
	$MUTEX_NAME = $sMutex
	Return True
EndFunc

Func mutex_check($sMutex)
	Local $fExists = False
	Local $hMutex = _WinAPI_CreateMutex($sMutex, False)
	If _WinAPI_GetLastError() = $ERROR_ALREADY_EXISTS Then
		$fExists = True
	Else
		$fExists = False
	EndIf
	_WinAPI_ReleaseMutex ($hMutex)
	_WinAPI_CloseHandle($hMutex)
	Return $fExists
EndFunc

Func mutex_release()
	_WinAPI_ReleaseMutex ($MUTEX_H)
	_WinAPI_CloseHandle($MUTEX_H)
	$MUTEX_H = 0
	$MUTEX_NAME = 0
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Проверять на существование лучше с помощью _WinAPI_OpenMutex(). Это же и написано в документации. А вообще, в AutoIt есть такая замечательная штука как скрытое окно, заголовок которого можно менять штатными средствами. IMHO, это намного проще и удобнее чем возня с Mutex.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Yashied [?]
Проверять на существование лучше с помощью _WinAPI_OpenMutex().
Точно.
Код:
...
	Local $hMutex = _WinAPI_OpenMutex($sMutex)
	If $hMutex Then
		$fExists = True
	Else
		$fExists = False
	EndIf
...


IMHO, это намного проще и удобнее чем возня с Mutex.
Занят. В этом заголовке у меня другое.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs сказал(а):
Занят. В этом заголовке у меня другое.
Ну так создайте свое невидимое окно. Это нормальная практика.
 
Верх