Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Глобальная переменная (http://forum.oszone.net/showthread.php?t=145912)

11943499 22-07-2009 22:33 1175034

Глобальная переменная
 
Доброе время !
Ищу не найду способ объявления переменной таким образом, чтобы ее видел каждый запущенный скрипт.
Возможно ли это в AI ?

Собственно, для чего это мне нужно.
1 Запущена программа, она в режиме ожидания.
2 Запущена эта же программа, второй экземпляр.
3 Надо в 2 определить тот факт что запущена 1 и прервать процесс обеих.
По всякому пробовал, не получается отследить. Наверное можно вычислить Pid-ы всех процессов с нужным наименованием окна и все их закрыть в цикле. Но окон может и не быть....
Была бы глобальная переменная, как это есть в Clipper... Тогда по ее значению можно было бы отследить процесс.

Func GoGo()
while 1
Sleep(3000)
WEnd
EndFunc

proxy 22-07-2009 23:10 1175070

Создать такую переменную нет возможности.

варианты:
1. создать переменную окреужения среды: EnvGet / EnvSet .. - созданные через AutoIt переменные окружения видны только в текущем скрипте, или в дочерных процессах.
Если и создовать переменную окружения, то только через bat, win api........
2. интереакция между скрипта, обсуждения хотя бы тут., пример тут.

beve 23-07-2009 00:08 1175131

Цитата:

Цитата 11943499
Надо в 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 1175393

Цитата:

Цитата beve
Но наверное тебе надо производить закрытие двух екземпляров, не при запуске второй копии, а в процессе работы... »

Этот скрипт закрывает второй экземпляр проги, а нужно закрыть их оба.

SyDr 23-07-2009 12:23 1175459

Ещё вариант:

Первый скрипт создаёт в темпе файл. Во время работы проверяет его наличие и если не обнаруживает - выход. Второй скрипт просто удаляет этот файл и выходит.

11943499 23-07-2009 12:56 1175490

Вот скриптик для реализации моей задачи, может пригодится :)

#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

proxy 23-07-2009 13:42 1175528

Цитата:

Цитата 11943499
Этот скрипт закрывает второй экземпляр проги, а нужно закрыть их оба. »

а у меня все отлично работает, закрываются оба скрипта. думаю даже сократить можно так:
Код:

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 & ' [ID] ' & $sProNameVer

If NOT _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 & ' [ID] ' & $sProNameVer

If NOT _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
Вот скриптик для реализации моей задачи, может пригодится »

сам себя он не закрывает при запуске первого экземпляра? :)

11943499 23-07-2009 18:39 1175833

Цитата:

Цитата proxy
а у меня все отлично работает, закрываются оба скрипта. думаю даже сократить можно так: »

В моем случае первый экземпляр находится в цикле ожидания while. При этом запуск второй версии убивает только сама себя.
Пришлось делать перебор все пидов с одноименным названием. Теперь хоть 50 экземпляров одноврменно можно отфутболивать.


Цитата:

Цитата proxy
сам себя он не закрывает при запуске первого экземпляра? »

Нет, У меня это через Else отслеживается :)

Супер коллаж функции в рюшечках у тебя ! :up

Кстати, хотел спросить по поводу функции HotKeySet
Почему-то на некторыхх компах она не работает вообще, а на некоторых работает не всегда. Как будто переполнение буфера клавы, после перегруза снова начинает работать. Пробовал на Apple компах, там вообще с этим глухо.
Есть что сказать по этому поводу ?

HotKeySet("^z", "BackUp")
HotKeySet("^x", "UnMount")

proxy 23-07-2009 19:05 1175856

Цитата:

Цитата 11943499
Теперь хоть 50 экземпляров одноврменно можно отфутболивать. »

если же второй же экземпляр закроет все, смысл так напрягаться?

Цитата:

Цитата 11943499
Нет, У меня это через Else отслеживается »

вот именно, что в примере то нет Else )

Цитата:

Цитата 11943499
Супер коллаж функции в рюшечках у тебя ! »

эээээээ, т.е?

Цитата:

Цитата 11943499
Почему-то на некторыхх компах она не работает вообще, а на некоторых работает не всегда. Как будто переполнение буфера клавы, после перегруза снова начинает работать. »

первый раз такое встречаю. какие ос были на этих компах?

Цитата:

Цитата 11943499
Пробовал на Apple компах, там вообще с этим глухо. »

Apple? AutoIt? ....разве компилятор работает под mac осью? ...

Цитата:

Цитата 11943499
HotKeySet("^z", "BackUp")
HotKeySet("^x", "UnMount") »

есть, где ни тестил на всех win xp работало всегда.

начни использовать тег: code, кнопочка с решеткой на панельке над полем ввода текста сообщения.
так удобней читать код.

11943499 23-07-2009 20:58 1175967

Цитата:

Цитата proxy
первый раз такое встречаю. какие ос были на этих компах? »

Делаю на W7 (x*64), проверял на XP Prof SP3, не работало на XP Prof SP2.
Я сам в шоке. Дома все отработал, принес на компы клиентам ставить, а там просто реакция 0 на Hotkeys и на _Ispressed
Кстати, такая же история и на Терминал Сервере (Server 2003), там горячие клавиши не срабатывали изначально. Потом вставил просмотр окна
Msgbox() непосредственно перед строкой срабатывания (_Ispressed), почему-то помогло. Как будто нужна некая задержка или инициализация.
Но sleep() не срабатывает. Вот так методом научного тыка.... Правда, использовал местами _ClipBoard_Empty(), может оно там что-то обнуляет...
В общем тыкаю дальше.

Цитата:

Цитата proxy
Apple? AutoIt? ....разве компилятор работает под mac осью? ... »

Железо Apple, ось XP Prof. Там клавиатура другая, есть даже F13, возможно сканкоды клавиш другие, хотя ими-то ось управляет, ХЗ.

Код:

HotKeySet("^z", "BackUp")


Время: 22:36.

Время: 22:36.
© OSzone.net 2001-