Что нового

Запрет запуска 2-х скриптов

EWR

Новичок
Сообщения
30
Репутация
1
Как запретить запуск 2-х одинаковых скриптов? Т.е. нельзя запустить 2 копии одного скрипта.
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Код:
; Предотвращение возможности множественного запуска скрипта.
If WinExists (@ScriptName) Then Exit
AutoItWinSetTitle (@ScriptName)
 
Автор
E

EWR

Новичок
Сообщения
30
Репутация
1
Все равно запускаются 2 копии и более
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Да неужели? А где вы расположили эти строчки? В начале программы? :scratch:
У меня работает. Попробуйте скомпилировать и запустить:
Код:
If WinExists (@ScriptName) Then Exit
AutoItWinSetTitle (@ScriptName)
MsgBox(48, "123", "hi!")

а потом закомментируйте две верхних строчки и проделайте то-же самое.
 
Автор
E

EWR

Новичок
Сообщения
30
Репутация
1
а все разместил вверху программы все работает, спасибо.


Добавлено:
Сообщение автоматически объединено:

А чтобы выдавало сообщение нужно так:

Код:
If WinExists (@ScriptName) Then MsgBox(0, "Error", "Program Alredy Run") Exit 
AutoItWinSetTitle (@ScriptName)


или иначе?
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Что мешает проверить?)
Код:
If WinExists (@ScriptName) Then Exit + error()
AutoItWinSetTitle (@ScriptName) 
func error()
MsgBox(48, "123", "error!")
EndFunc
MsgBox(48, "123", "hi!")


Я так делал..
 
Автор
E

EWR

Новичок
Сообщения
30
Репутация
1
все спасибо.
 

Fever

Скриптер
Сообщения
308
Репутация
112
это в случае, когда у программы есть интерфейс. для иных случаев есть:
Код:
_Singleton
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 609
Репутация
2 438
Fever [?]
это в случае, когда у программы есть интерфейс
Кто сказал?
AutoItWinSetTitle работает с внутренним скрытым окном, который имеет класс «AutoIt v3» (в отличии от GUI-окна - «AutoIt v3 GUI»).
Кстати надёжнее именно с ним и работать:

Код:
If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then
    MsgBox(48, @ScriptName, 'Позволено запускать только одну копию программы!' & @CRLF & @CRLF & 'ОК ==> ВЫХОД')
    Exit
EndIf

AutoItWinSetTitle(@ScriptName)


для иных случаев есть
Я уже давно отказался от использования _Singleton, она не всегда срабатывает (и не спрашиваете в каких случаях, сам толком не знаю :smile:).
 

helecu

Новичок
Сообщения
2
Репутация
0
Испробовал все варианты предложенные в теме. Намеренно скриптом запуская 2 раза другой скрипт. Единственным рабочим оказался:
Код:
_Singleton

Остальные раза с 10го, но запускали 2 копии скрипта, позволяя начать выполняться коду, который стоял после проверки.
 

kaslit

Новичок
Сообщения
6
Репутация
0
Это всё не работает под терминальными режимами и т.п. когда много пользователей. Я использую костыльное решение для пользователей терминального режима. Запустить может только один, у остальных будет срабатывать EXIT:
создаём файл $PathIni и туда пишем чnj-нибудь. но постоянно. чтобы у файла всегда менялся атрибут последнего доступа.


$arrayDateTimeStampINI= FileGetTime($PathIni, $FT_ACCESSED, $FT_ARRAY)
$sDateTimeStampINI=$arrayDateTimeStampINI[0]&"/"&$arrayDateTimeStampINI[1]&"/"&$arrayDateTimeStampINI[2]&" "&$arrayDateTimeStampINI[3]&":"&$arrayDateTimeStampINI[4]&":"&$arrayDateTimeStampINI[5]

sleep (1000)
[email protected] &"/"& @MON &"/"& @MDAY &" "& @HOUR &":"& @MIN &":"& @SEC

$iDateCalc = _DateDiff('s', $sDateTimeStampINI, $sNowDateSec)

if $iDateCalc < 4 then
MsgBox($MB_SYSTEMMODAL, "Внимание!", "Приложение уже работает!")
FileStatWrite(" Скрипт is already running from another user=" & $iDateCalc)
Exit
EndIf
 
Верх