Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Глобальная переменная

Ответить
Настройки темы
Глобальная переменная

Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: 11943499
Дата: 22-07-2009
Доброе время !
Ищу не найду способ объявления переменной таким образом, чтобы ее видел каждый запущенный скрипт.
Возможно ли это в AI ?

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

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

Отправлено: 22:33, 22-07-2009

 

Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


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

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

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Последний раз редактировалось proxy, 23-07-2009 в 14:05.


Отправлено: 23:10, 22-07-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Цитата 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
Но наверное тебе надо производить закрытие двух екземпляров, не при запуске второй копии, а в процессе работы...

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:08, 23-07-2009 | #3


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:22, 23-07-2009 | #4


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Ещё вариант:

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

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Отправлено: 12:23, 23-07-2009 | #5


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

#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

Последний раз редактировалось 11943499, 23-07-2009 в 13:08.


Отправлено: 12:56, 23-07-2009 | #6


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


Цитата 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:
Вот скриптик для реализации моей задачи, может пригодится »
сам себя он не закрывает при запуске первого экземпляра?

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:42, 23-07-2009 | #7


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


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


Цитата proxy:
сам себя он не закрывает при запуске первого экземпляра? »
Нет, У меня это через Else отслеживается

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

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

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

Отправлено: 18:39, 23-07-2009 | #8


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


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

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

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

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

Цитата 11943499:
Пробовал на Apple компах, там вообще с этим глухо. »
Apple? AutoIt? ....разве компилятор работает под mac осью? ...

Цитата 11943499:
HotKeySet("^z", "BackUp")
HotKeySet("^x", "UnMount") »
есть, где ни тестил на всех win xp работало всегда.

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

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 19:05, 23-07-2009 | #9


Новый участник


Сообщения: 36
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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")

Отправлено: 20:58, 23-07-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Глобальная переменная

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
V. 5.5/2000/2003 - Глобальная Адресная книга и контакты Notsaint Microsoft Exchange Server 1 06-08-2009 08:14
Debian/Ubuntu - Глобальная локалка или с чего начать !!! 9gramm Общий по Linux 2 12-02-2009 15:00
Глобальная проблема с Aspire 5102 WLMi Торквемада Ноутбуки 31 23-12-2008 14:35
Ошибка - [решено] Глобальная проблема с проводником (Internet Explorer) wowbkgg Microsoft Windows 2000/XP 2 12-10-2008 12:48
Глобальная адресная книга. sova_sergey Microsoft Exchange Server 6 15-08-2008 12:27




 
Переход