Поиск дочернего окна

Обсуждение программ nnCron и nnCron LITE

Re: Поиск дочернего окна

Postby VoidVolker » Wed, 13 Nov 2013, 17:17

А если приглядеться чуть внимательнее к самим хэндлам окон? Винда их обычно выдает их по порядку, соответственно для окон, созданных подряд хэндлы будут идти с некоторым шагом.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Fri, 15 Nov 2013, 15:50

VoidVolker wrote:А если приглядеться чуть внимательнее к самим хэндлам окон? Винда их обычно выдает их по порядку, соответственно для окон, созданных подряд хэндлы будут идти с некоторым шагом.


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

2. Пологаться на непрерывность последовательности хэндлов в общем случае нельзя. Вдруг создание окон окажется на границе кванта времени, выделяемого системой программе GPSCockPit,
или процесс с более высоким приоритетом вклинится между созданием статиков.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Fri, 15 Nov 2013, 16:02

AlikasS wrote:SH:M>Min переведет строку в минуты итого мы имеем на стеке количество минут из таймера в программе
предлагаю вычислить из текущего времени (из системы) аналогичное число
сравнить их и принять решение о синхронизации или не...


Хочется всё же иметь возможность задавать диапазон в секундах.
Со стороны системы уже есть готовая функция nnCron-а

TimeSec@

А для разбора строки с GPS временем нужно написать слово СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ.

Прочитал в Броудли про функции NUMBER и CONVERT, но консоль на них ругается.
Видно это уже устаревшие функции. А что взамен?
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Fri, 15 Nov 2013, 20:09

А как выглядит строка-то с текстом?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Mon, 18 Nov 2013, 05:45

VoidVolker wrote:А как выглядит строка-то с текстом?

Самая обычная строка 02:50:15 например.

Строка берётся из FOUND-CHILD-WINDOW

Code: Select all
#( Test_Static_Time
RunOnce
NoDel
Time: 0 11 14 10 * 2013
VARIABLE GPSStaticFound
Action:
WIN-EXIST: "GPSCockpit*"
IF
   WIN-ACTIVATE: "GPSCockpit*"   \  активируем главное окно GPSCockpit*
   WIN-ACTIVE: "GPSCockpit*"     \  проверяем, активировалось ли?
   IF
      0 GPSStaticFound !
      FOR-CHILD-WINDOWS: "Static"
         \ ... перебираем дочерние окна класса Static
         \ WIN-CHILD-HWND GetDlgCtrlID N>S MsgBox
         WIN-CHILD-HWND GetDlgCtrlID 1007 =
         IF
            MSG: "GPS время %FOUND-CHILD-WINDOW%"   
            -1 GPSStaticFound !
            GET-CUR-TIME  \ Это надо для следующего слова или нет?
           \ TimeSec@      \ Секунды от начала суток по системным часам
           \ СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ \ А вот здесь хочу получить секунды из текстовой строки
         THEN
      ;FOR-CHILD-WINDOWS

      GPSStaticFound @ 0 =
      IF
         MSG: "Не удалось найти окно GPS Time"   
      ELSE
         MSG: "Удалось найти окно GPS Time"   
      THEN

   ELSE
      MSG: "Не удалось активировать окно GPS Information"   
   THEN
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."
)#


Проблема в том, что на функции NUMBER и CONVERT, но консоль ругается
CONVERT
^ -2003 WORD OR FILE ISN'T FOUND
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Mon, 18 Nov 2013, 06:18

Code: Select all
SHH:MM:SS
на входе строка вида S" 01:55:28" на выходе три числа 1 55 28

или
Code: Select all
SH:M:S>Sec
которое переведет строку сразу в секунды
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby Burunduk » Mon, 18 Nov 2013, 08:29

AlikasS wrote:SHH:MM:SS на входе строка вида S" 01:55:28" на выходе три числа 1 55 28


Что-то не работают оба варианта!
Вот результаты работы в консоли

Ok
S" 01:55:28"
Ok ( 17838827 8 )
SHH:MM:SS
Ok ( 0 0 0 )

S" 01:55:28"
Ok ( 0 0 0 17838827 8 )
SH:M:S>Sec
Ok ( 0 0 0 0 )

На всякий случай посмотрел

BASE
Ok ( 0 0 0 0 17833688 )
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Mon, 18 Nov 2013, 09:41

Burunduk wrote:
AlikasS wrote:SHH:MM:SS на входе строка вида S" 01:55:28" на выходе три числа 1 55 28


Что-то не работают оба варианта!
Вот результаты работы в консоли

а так
Code: Select all
S" 01:55:28" SHH:MM:SS

и
Code: Select all
S" 01:55:28" SH:M:S>Sec

:-D

в консоли следующая строка затирает предыдущую во временном буфере
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby Burunduk » Mon, 18 Nov 2013, 10:02

AlikasS wrote:в консоли следующая строка затирает предыдущую во временном буфере


Засада! Как же тогда отлаживаться...

Вообще, со строками в голове полный компот. Сейчас повезло, что есть готовые подходящие слова, но в общем случае
хочется научиться работать со строками(т.е. что-то прочитать кроме местами устаревшего Броудли)

Вдруг в каком-нибудь случае будет строка вида: "Час: 1 Минута: 55 Секунда: 28".
Да просто цифирьки из текстового файла порой надо считать.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Mon, 18 Nov 2013, 10:26

Burunduk wrote:в консоли следующая строка затирает предыдущую во временном буфере


Написал задачку НЕ В КОНСОЛИ
Опять работает странно...

Code: Select all
#( Test_Static_Time
RunOnce
NoDel
Time: 0 11 14 10 * 2013
VARIABLE GPSStaticFound
: СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ SH:M:S>Sec ;
Action:

WIN-EXIST: "GPSCockpit*"
IF
   WIN-ACTIVATE: "GPSCockpit*"   \  активируем главное окно GPSCockpit*
   WIN-ACTIVE: "GPSCockpit*"     \  проверяем, активировалось ли?
   IF
      0 GPSStaticFound !
      FOR-CHILD-WINDOWS: "Static"
         \ ... перебираем дочерние окна класса Static
         \ WIN-CHILD-HWND GetDlgCtrlID N>S MsgBox
         WIN-CHILD-HWND GetDlgCtrlID 1007 =
         IF
            MSG: "GPS время %FOUND-CHILD-WINDOW%"   
            -1 GPSStaticFound !
            GET-CUR-TIME  \ Это надо для следующего слова или нет?
            TimeSec@      \ Секунды от начала суток по системным часам
            DUP MSG: "TimeSec@ вернул %N>S%"   \ И ВОТ ЗДЕСЬ в окошке выводится ""TimeSec@ вернул 1" !!!
            СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ  \ Работает или нет не понятно!
            MSG: "Перед сравнением"   \ Этого сообщения НЕТ!
            - N>S MsgBox
         THEN
      ;FOR-CHILD-WINDOWS

      GPSStaticFound @ 0 =
      IF
         MSG: "Не удалось найти окно GPS Time"   
      ELSE
         MSG: "Удалось найти окно GPS Time"    \ Это есть, как и должно быть
      THEN

   ELSE
      MSG: "Не удалось активировать окно GPS Information"   
   THEN
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."   \ И это есть, как и должно быть
)#
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Mon, 18 Nov 2013, 10:57

Вот более правильный вариант:

Code: Select all
#( Test_Static_Time
RunOnce
NoDel
Time: 0 11 14 10 * 2013
VARIABLE GPSStaticFound
: СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ SH:M:S>Sec ;
Action:

WIN-EXIST: "GPSCockpit*"
IF
   WIN-ACTIVATE: "GPSCockpit*"   \  активируем главное окно GPSCockpit*
   WIN-ACTIVE: "GPSCockpit*"     \  проверяем, активировалось ли?
   IF
      0 GPSStaticFound !
      FOR-CHILD-WINDOWS: "Static"
         \ ... перебираем дочерние окна класса Static
         \ WIN-CHILD-HWND GetDlgCtrlID N>S MsgBox
         WIN-CHILD-HWND GetDlgCtrlID 1007 =
         IF
            MSG: "GPS время %FOUND-CHILD-WINDOW%"   
            -1 GPSStaticFound !
            GET-CUR-TIME  \ Это надо для следующего слова или нет?
            TimeSec@      \ Секунды от начала суток по системным часам
            DUP N>S MsgBox  \  вывод 60816
            FOUND-CHILD-WINDOW СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ \ А вот здесь хочу получить секунды из текстовой строки
            DUP N>S MsgBox  \ вывод 28445
            MSG: "Перед сравнением"
            - N>S MsgBox \ вывод 32371
         THEN
      ;FOR-CHILD-WINDOWS

      GPSStaticFound @ 0 =
      IF
         MSG: "Не удалось найти окно GPS Time"   
      ELSE
         MSG: "Удалось найти окно GPS Time"   
      THEN

   ELSE
      MSG: "Не удалось активировать окно GPS Information"   
   THEN
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."
)#


Но результаты тоже не годятся!
Опять какой-то побочный эффект?
Значение FOUND-CHILD-WINDOW чем-то портится?
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Mon, 18 Nov 2013, 11:52

Burunduk wrote:Но результаты тоже не годятся!


Как говориться, сам дурак!
На обсерватории стоит Гринвичское время(совпадает с GPS), а отлаживал на местном времени.

Поменял время на Гринвич и получил разницу в 31 секунду, что в разумных пределах.


И всё же со строками хочется разобраться.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Tue, 19 Nov 2013, 13:14

Самый простой вариант - обрабатывать строки регулярными выражениями.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Wed, 20 Nov 2013, 06:41

VoidVolker wrote:Самый простой вариант - обрабатывать строки регулярными выражениями.


Может сначала винтовку освоить, а потом пулемёт? :rolleyes:

Некоторое просветление началось после изучения в хелпе Крона раздела
"Неотложная помощь" по Форту
Какие типы строк используются в SP-Forth? и т.д.

Обнаружил, что строк 3 вида. Но не понятно, где они живут, сколько времни живут, как удаляются(есть ли сборщик мусора).

Создал, например, две строки и склеил

S" Первая" S" Вторая" S+
и что в итоге получилось - 1 и 2 строка еще живы в памяти или есть только третья строка?

Можно ли вместо выделения массива и PLACE просто запомнить a1, u1, a2, u2, в четырёх обычных переменных?
Что бы потом, например, склеить строки в обратном порядке?


Еще вопрос - есть ли локальные переменные внутри определения слова?
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Wed, 20 Nov 2013, 09:45

Со строками опять проблемы ...
Нужно преобразовать секунды от начала суток в строку времени вида 12:45:59
(Хочу запротоколировать работу синхронизации в файле)

Пробую так

Code: Select all
#( Отладка
NoActive
RunOnce
NoDel
Time: 11 12 20 11 * 2013

: СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ SH:M:S>Sec ;

: СЕКУНДЫ-В-СТРОКА-ВРЕМЕНИ ( Sec  ) 60 /MOD 60 /MOD ( Sec Min Hour )
  S>D <# # # #> ( Sec Min Ha Hu )
  2SWAP           ( Ha Hu Sec Min )
  S>D <# # # #> ( Ha Hu Sec Ma Mu )
  ROT               ( Ha Hu Ma Mu Sec )
  S>D <# # # #> ( Ha Hu Ma Mu Sa Su )
;

Action:

S" 12:45:59" СТРОКА-ВРЕМЕНИ-В-СЕКУНДЫ
 СЕКУНДЫ-В-СТРОКА-ВРЕМЕНИ
 S+ S+ MsgBox
 
)#


Для надёжности прописал(и проверил в консоли) состояние стека после каждой операции
Но почему-то в Кроне получаю 595959, а не 124559

В консоли же получаю 222222
Last edited by VoidVolker on Wed, 20 Nov 2013, 23:22, edited 1 time in total.
Reason: Для код следует использовать bb-тег code
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 3 guests