Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Вопросы по wait и нецелым числам., Впервые столкнулся за столько лет. :)
Kangoshi
сообщение 11.2.2021, 3:40
Сообщение #1


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Переменную с функцией wait нельзя использовать, да? Пытался увеличивать время паузы с каждой новой итерацией, но получил ошибку. Пытался сделать так:
wait #delay
Как реализовать-то?
Пытался увеличивать значение этой переменной умножением на 1,5 (и с точкой, и с запятой) - в одном случае получал ошибку (вроде), в другом умножение происходило на 1. Но эту проблему решил так:
set #delay #delay * 15 / 10
По мне, так криво, но хотя бы работает. По-другому никак? (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 11.2.2021, 3:49
Сообщение #2


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2382
Пользователь №: 18.746



Wait не может ждать "полмиллисекундочки"))
Так что округляйте значение:
--lua
log "clear"
delay = 10

while 1==1 do
wait(delay)
delay = math.floor(delay * 1.2)
log("ждем")
end


Сообщение отредактировал Fors1k - 11.2.2021, 3:50


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 11.2.2021, 15:31
Сообщение #3


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Благодарю за ответ, дало пищу для размышлений, накидал отдельный простенький цикл для теста и оказалось, что дробная часть откидывается. И даже wait #x работает.
set #x 250
set logging clear
repeat 100
set #x #x * 15 / 10
log #x
wait #x
end_repeat
Значит ошибка в чём-то другом. Скорее всего мозг уже тупил в 3 утра. (IMG:style_emoticons/default/laugh.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 11.2.2021, 16:20
Сообщение #4


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Пилот на старом синтаксисе не поддерживат операции с плавающей точкой. Используйте либо lua (пилот его полностью поддерживат, для включения введите первой строкой --lua). Либо используйте только целые числа.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 11.2.2021, 23:29
Сообщение #5


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Начал переписывать всё в lua и столкнулся с проблемой: в lua один универсальный тип переменной: "Lua динамически типизированный язык. Это означает, что значения не имеют типов; только значения. Язык не имеет определений типов. Все значения несут свой собственный тип."
Функция findwindow записывает "неправильные" PID хендлы в случае типа переменной "массив". И если в языке пилота можно использовать числовую переменную, то в lua такой возможности нет.
Проверял этим:
Код
set logging clear
set #h FindWindow (AsteriosGame.exe)
set %h FindWindow (AsteriosGame.exe)
log Clients found:
log size(%h)
log Handle single variable:
log #h
log Handles array:
for #i 1 size(%h)
log %h [#i 1]
end_for
log Switch to game in 2 seconds.
wait 2s
set #aw getwindow (0)
log Handle active window:
log #aw
end_script

В Lua на одном окне:
Код
--lua
log ("clear")
local h = findwindow ("AsteriosGame.exe")
log (#h)
log ("Handle lua:")
log (h[1][1])
log ("Switch to game in 2 seconds.")
wait ("2s")
local a = getwindow (0)
log ("Handle lua active window:")
log (a)

getwindow в lua работает нормально, потому что результат - одиночное значение и переменная не считается массивом. Однако даже если findwindow найдёт всего одно окно, то тип переменной будет считаться "Lua Table".
Вот такая беда... Отдельную тему не стал создавать, т.к. из первоначальной проблемы вылезла эта.
PS Значения PID handle в массиве четырёхзначные, в одиночной переменной шестизначные. Например: 3748 и 721550.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.2.2021, 0:23
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Подобные огрехи единичные, но к сожалению встречаются. Все портировать идеально и ничего не забыть банально сложно. К сожалению нативно дернуть альтернативными средствами пилота нельзя. Правда, думаю, Cirus, сейчас что-нибудь подкинет из связки ffi и WinAPI.
LuaTable будет в любом случае по одной просто причине - это правильно. Ну вот просто идейно это верно. Не должен вызов функции возвращать данные в разных типах в зависимости от фазы луны. Еще во время запроса мы должны четко понимать какой тип данных вернется, а количество окон мы знать ну никак не обязаны, чтобы предполагать этот тип данных.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 12.2.2021, 0:48
Сообщение #7


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2382
Пользователь №: 18.746



Что-то так и не понял в чем проблема, поясните.
Запустил у себя, вот выводы:
Цитата
1
PID:
2687278
Switch to gam in 2 seconds.
PID active window:
921896

Цитата
Clients found:
1
PID single variable:
2687278
PIDs array:
2687278
Switch to game in 2 seconds.
PID active window:
921896

Данные одинаковые.

Сообщение отредактировал Fors1k - 12.2.2021, 0:48


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 12.2.2021, 0:56
Сообщение #8


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



А у меня разные:
Код
0:50:59 2 (autosaved_2.txt, 3): Clients found:
0:51:00 2 (autosaved_2.txt, 4): 1
0:51:00 2 (autosaved_2.txt, 5): PID single variable:
0:51:00 2 (autosaved_2.txt, 6): 721550
0:51:00 2 (autosaved_2.txt, 7): PIDs array:
0:51:00 2 (autosaved_2.txt, 9): 3748
0:51:00 2 (autosaved_2.txt, 11): Switch to game in 2 seconds.
0:51:03 2 (autosaved_2.txt, 14): PID active window:
0:51:03 2 (autosaved_2.txt, 15): 721550

логи скрипта в lua:
Код
0:57:01 1 (autosaved_1.txt, 0): 1
0:57:01 1 (autosaved_1.txt, 0): PID:
0:57:01 1 (autosaved_1.txt, 0): 3748
0:57:01 1 (autosaved_1.txt, 0): Switch to gam in 2 seconds.
0:57:03 1 (autosaved_1.txt, 0): PID active window:
0:57:03 1 (autosaved_1.txt, 0): 721550

Клиент игры Asterios, Windows 7 x64, проверял и в обычной, и в Night version.
А вы на чём проверяли?
Проверил только что на калькуляторах с выключенным клиентом игры - результат тот же, данные в массиве отличаются от данных в переменной числового типа.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.2.2021, 1:14
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Мля... Это не PID! Это хендлы! Я почему-то подумал, что в пилотовском варианте оно еще пиды возвращало. Все хендлы прилетают корректно.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 12.2.2021, 1:18
Сообщение #10


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Цитата(DarkMaster @ 12.2.2021, 1:14) *

Мля... Это не PID! Это хендлы! Я почему-то подумал, что в пилотовском варианте оно еще пиды возвращало. Все хендлы прилетают корректно.

Ок... Прошу прощения за то, что попутал термины.
Я всё ещё не понимаю почему они у меня разнятся в зависимости от типа переменной? (IMG:style_emoticons/default/smile.gif) Проверял на двух компах, но на обоих Windows 7.
Попробую днём на "десятке". Может в "семёрке" не хватает какого-нибудь пакета.
PS Отредактировал первое сообщение, оставил зачёркнутые PID для истории.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.2.2021, 1:36
Сообщение #11


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
Попробую днём на "десятке". Может в "семёрке" не хватает какого-нибудь пакета.

Может у вас просто с аналогичным именем что-то открыто? Например свойства файла. А вообще рекомендую использовать кавычки даже в старом синтаксисе.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 12.2.2021, 1:51
Сообщение #12


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Цитата(DarkMaster @ 12.2.2021, 1:36) *

Может у вас просто с аналогичным именем что-то открыто? Например свойства файла. А вообще рекомендую использовать кавычки даже в старом синтаксисе.

Нет, в процессах же видно сколько процессов с таким именем. Да и проверял не только на клиенте игры, а и на калькуляторе.
Вот только что проверил на третьем компе с Windows 10 на приложении mspaint.exe - результат тот же. Винда вообще "голая", только после установки, с апдейтами ноября прошлого года.
Запишу видео тогда. Только вряд ли сейчас, днём или ближе к вечеру выложу. И ещё надо попробовать "нестабильную" версию, хотя надежды мало.
PS Попробовал с кавычками - результат тот же.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 12.2.2021, 2:03
Сообщение #13


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Вообще-то это недолго делается, а уснуть не даст, поэтому...
Commietube
2 окна, видно хендлы обоих окон (первый - последнее запущенное, последний - активное, запущено первым, просто на него переключился.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 12.2.2021, 3:02
Сообщение #14


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



Если надо найти хендлы окон, то так:
код
Код
--lua
local ffi = require("ffi")
ffi.cdef[[
int FindWindowExA(int hWndParent, int hWndChildAfter, const char* lpszClass, const char* lpszWindow);
int GetWindowTextA(int hWnd, char* lpString, int nMaxCount);
]]

function find_window(array, name_window)
    local WindowName = ffi.new('char[999]')
    local handle = ffi.C.FindWindowExA(0, 0, nil, nil)
    while handle > 0 do
        ffi.C.GetWindowTextA(handle, WindowName, ffi.sizeof(WindowName))
        if ffi.string(WindowName):match(name_window) then
            array[#array+1] = {handle, ffi.string(WindowName)}
        end
        handle = ffi.C.FindWindowExA(0, handle, nil, nil)
    end
end


log 'clear' log 'mode compact'
local h = {}
find_window(h, 'Asterios')  -- поиск окна, можно указать часть имени
log ('Найдено окон: ' .. tostring(#h))
for i=1, #h do
    log(h[i][1], h[i][2])
end

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Kangoshi
сообщение 12.2.2021, 3:29
Сообщение #15


**

Neophyte
Сообщений: 36
Регистрация: 9.8.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.878



Цитата(cirus @ 12.2.2021, 3:02) *

Если надо найти хендлы окон, то так:

Иии... вся прелесть пилота с его кратким синтаксисом коту под хвост. (IMG:style_emoticons/default/laugh.gif)
Кстати о котах, аватарка - загяденье. (IMG:style_emoticons/default/wink.gif)
Спасибо за код, попробую. (IMG:style_emoticons/default/thanks.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 25.4.2024, 8:26
Designed by Nickostyle