Показать полную графическую версию : Глобальная переменная
11943499
22-07-2009, 22:33
Доброе время !
Ищу не найду способ объявления переменной таким образом, чтобы ее видел каждый запущенный скрипт.
Возможно ли это в AI ?
Собственно, для чего это мне нужно.
1 Запущена программа, она в режиме ожидания.
2 Запущена эта же программа, второй экземпляр.
3 Надо в 2 определить тот факт что запущена 1 и прервать процесс обеих.
По всякому пробовал, не получается отследить. Наверное можно вычислить Pid-ы всех процессов с нужным наименованием окна и все их закрыть в цикле. Но окон может и не быть....
Была бы глобальная переменная, как это есть в Clipper... Тогда по ее значению можно было бы отследить процесс.
Func GoGo()
while 1
Sleep(3000)
WEnd
EndFunc
Создать такую переменную нет возможности.
варианты:
1. создать переменную окреужения среды: EnvGet / EnvSet .. - созданные через AutoIt переменные окружения видны только в текущем скрипте, или в дочерных процессах.
Если и создовать переменную окружения, то только через bat, win api........
2. интереакция между скрипта, обсуждения хотя бы тут. (http://forum.oszone.net/thread-143261.html), пример тут. (http://forum.oszone.net/post-1175528-7.html)
Надо в 2 определить тот факт что запущена 1 и прервать процесс обеих. »
Если екземпляров будет только два, почему бы не сделать что то вроде этого:
#include <Misc.au3>
if _Singleton(@ScriptName,1) = 0 And ProcessExists ( @ScriptName) Then
Msgbox(0,"Сообщение","Второй екземпляр проги запущен", 2)
ProcessClose(@ScriptName)
Msgbox(0,"Сообщение","Все ок, закрываемся!",2)
Exit
EndIf
Msgbox(0,"Сообщение","Первый екземпляр проги запущен",2)
while 1
Sleep(100)
wend
Но наверное тебе надо производить закрытие двух екземпляров, не при запуске второй копии, а в процессе работы...
11943499
23-07-2009, 11:22
Но наверное тебе надо производить закрытие двух екземпляров, не при запуске второй копии, а в процессе работы... »
Этот скрипт закрывает второй экземпляр проги, а нужно закрыть их оба.
Ещё вариант:
Первый скрипт создаёт в темпе файл. Во время работы проверяет его наличие и если не обнаруживает - выход. Второй скрипт просто удаляет этот файл и выходит.
11943499
23-07-2009, 12:56
Вот скриптик для реализации моей задачи, может пригодится :)
#include <Misc.au3>
$list = ProcessList()
if _Singleton(@ScriptName,1) = 0 And ProcessExists ( @ScriptName) Then
for $i = 1 to $list[0][0]
If $list[$i][0] = @ScriptName Then
$PID = ProcessExists($list[$i][1])
ProcessClose($PID)
endif
Next
Exit
EndIf
Этот скрипт закрывает второй экземпляр проги, а нужно закрыть их оба. »
а у меня все отлично работает, закрываются оба скрипта. думаю даже сократить можно так:
If NOT _Singleton(@ScriptName, 1) Then
можно попробовать вот такой вариант:
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Global Const $sProName = 'Test name'
Global Const $sProVerNo = '0.1'
Global Const $sProVer = 'v' & $sProVerNo
Global Const $sProNameVer = $sProName & ' ' & $sProVer
Global Const $sProIDText = $sProNameVer & ' ' & $sProNameVer
If NOT [i]_Singleton($sProIDText, 1) Then
MsgBox(48, 'Внимание', 'Один экземпляр скрипта уже запущенны' & @CRLF & 'Все экземпляры сейчас будут закрыты')
While WinExists($sProIDText)
WinKill($sProIDText)
WEnd
_Pro_Exit()
EndIf
AutoItWinSetTitle($sProIDText)
HotKeySet('{ESC}', '_Pro_Exit'); ESC - закрыть скрипт
GUICreate('Test', 400, 400)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUISetState()
While 1
Sleep(10)
WEnd
Func _Pro_Exit()
Exit
EndFunc
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
Return $GUI_RUNDEFMSG
EndFunc
или вот такой вариант, через элементы управления - корректное закртые скрипта:
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Global Const $sProName = 'Test name'
Global Const $sProVerNo = '0.1'
Global Const $sProVer = 'v' & $sProVerNo
Global Const $sProNameVer = $sProName & ' ' & $sProVer
Global Const $sProIDText = $sProNameVer & ' ' & $sProNameVer
If NOT [i]_Singleton($sProIDText, 1) Then
MsgBox(48, 'Внимание', 'Один экземпляр скрипта уже запущенны' & @CRLF & 'Все экземпляры сейчас будут закрыты')
Opt('WinTitleMatchMode', 2)
ControlSetText('[TITLE:' & $sProIDText & '; CLASS:AutoIt v3;]', '', '[CLASS:Edit; INSTANCE:1]', 'exit')
_Pro_Exit()
EndIf
AutoItWinSetTitle(@AutoItPID & ' ' & $sProIDText)
Global Const $hAutoItWin = WinGetHandle(@AutoItPID & ' ' & $sProIDText)
HotKeySet('{ESC}', '_Pro_Exit'); ESC - закрыть скрипт
GUICreate('Test', 400, 400)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUISetState()
While 1
Sleep(10)
If ControlGetText($hAutoItWin, '', '[CLASS:Edit; INSTANCE:1]') == 'exit' Then _Pro_Exit()
WEnd
Func _Pro_Exit()
Exit
EndFunc
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
Return $GUI_RUNDEFMSG
EndFunc
Вот скриптик для реализации моей задачи, может пригодится »
сам себя он не закрывает при запуске первого экземпляра? :)
11943499
23-07-2009, 18:39
а у меня все отлично работает, закрываются оба скрипта. думаю даже сократить можно так: »
В моем случае первый экземпляр находится в цикле ожидания while. При этом запуск второй версии убивает только сама себя.
Пришлось делать перебор все пидов с одноименным названием. Теперь хоть 50 экземпляров одноврменно можно отфутболивать.
сам себя он не закрывает при запуске первого экземпляра? »
Нет, У меня это через Else отслеживается :)
Супер коллаж функции в рюшечках у тебя ! :up
Кстати, хотел спросить по поводу функции HotKeySet
Почему-то на некторыхх компах она не работает вообще, а на некоторых работает не всегда. Как будто переполнение буфера клавы, после перегруза снова начинает работать. Пробовал на Apple компах, там вообще с этим глухо.
Есть что сказать по этому поводу ?
HotKeySet("^z", "BackUp")
HotKeySet("^x", "UnMount")
Теперь хоть 50 экземпляров одноврменно можно отфутболивать. »
если же второй же экземпляр закроет все, смысл так напрягаться?
Нет, У меня это через Else отслеживается »
вот именно, что в примере то нет Else )
Супер коллаж функции в рюшечках у тебя ! »
эээээээ, т.е?
Почему-то на некторыхх компах она не работает вообще, а на некоторых работает не всегда. Как будто переполнение буфера клавы, после перегруза снова начинает работать. »
первый раз такое встречаю. какие ос были на этих компах?
Пробовал на Apple компах, там вообще с этим глухо. »
Apple? AutoIt? ....разве компилятор работает под mac осью? ...
HotKeySet("^z", "BackUp")
HotKeySet("^x", "UnMount") »
есть, где ни тестил на всех win xp работало всегда.
начни использовать тег: code, кнопочка с решеткой на панельке над полем ввода текста сообщения.
так удобней читать код.
11943499
23-07-2009, 20:58
первый раз такое встречаю. какие ос были на этих компах? »
Делаю на W7 (x*64), проверял на XP Prof SP3, не работало на XP Prof SP2.
Я сам в шоке. Дома все отработал, принес на компы клиентам ставить, а там просто реакция 0 на Hotkeys и на _Ispressed
Кстати, такая же история и на Терминал Сервере (Server 2003), там горячие клавиши не срабатывали изначально. Потом вставил просмотр окна
Msgbox() непосредственно перед строкой срабатывания (_Ispressed), почему-то помогло. Как будто нужна некая задержка или инициализация.
Но sleep() не срабатывает. Вот так методом научного тыка.... Правда, использовал местами _ClipBoard_Empty(), может оно там что-то обнуляет...
В общем тыкаю дальше.
Apple? AutoIt? ....разве компилятор работает под mac осью? ... »
Железо Apple, ось XP Prof. Там клавиатура другая, есть даже F13, возможно сканкоды клавиш другие, хотя ими-то ось управляет, ХЗ.
HotKeySet("^z", "BackUp")
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.