RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ещё не много про Rexx под windows


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : Алексей Тарасов, 2:5053/57
To : All
Subj : Ещё не много про Rexx под windows

Чуть ранее, в другой ветке, я задавал вопрос про обмен данными между программами, работающими на Regina Rexx и OORexx. Решения пока нет. Но решил задать ряд других вопросов, из-за которых пришлось совмещать использование интерпретаторов. Возможно, удастся их разрешить по отдельности. Всё ниже сказанное, относиться к windows.

1. Работа с Socket’ами.
У Regina Rexx не встроенного механизма и я не смог заставить работать сторонние библиотеки, тогда как код взлетел на OORexx. Возможно я не до конца разобрался в этом вопросе. Если у кого есть опыт, прошу поделиться. Если будут примеры, просто замечательно.

2. Не корректная работа «SysFileTree» в Regina Rexx.
Как показал опыт работы - это так. Иногда перестают «видется» файла лежащие даже в целевом каталоге. Систематизировать ошибку не удалось, все написанные тесты, которые вроде как бы дают повторяющийся результат, не работают на других машинах, да и через некоторое время перестают работать на той машине, где писались. Писал баг рапорт, результата ноль. Для обхода ситуации использую команду OS dir. Но и тут не всё гладко. Иногда вылетает ошибка, которая вешает весь скрипт. Написал обёртку, с попыткой отлавливать ошибку, стало легче, но иногда ошибка всё равно проскакивает. Подозрение, на то, что это происходит когда N число процессов, запускают это процедуру одновременно.
Как вариант обхода, использование сторонней библиотека с похожей функции. Но найти такую я не смог, хотя под OS/2 есть.

FileTree:
/* Версия 1.0.0 от 13.08.2023
Ищем файл по маске. Обёртка для команды os dir.
<!> Процедура не защищена! Чистит за собой.

На входе:
ftFileActual - Маска для поиска.
ftStem - Стем куда будет помещена информация о найденных файлах. Замыкающая точка обязательна.
ftScanSubDirOptions - Опции для поиска файлов. [/s/b/a-d]
ftStemErr - Стем куда будет помещена информация о ошибках. [ReturnErr.] Замыкающая точка обязательна.
ftNumberOfAttempts - Число попыток при ошибке. Технический параметр. [5] Иногда возникает ошибка ОС, это костыль для неё.
*/

parse arg ftFileActual, ftStem, ftScanSubDirOptions, ftStemErr, ftNumberOfAttempts
if ftNumberOfAttempts='' then ftNumberOfAttempts=5
if ftScanSubDirOptions='' then ftScanSubDirOptions='/s/b/a-d' /* Включаем поиск в подкаталогах, возвращем только файлы */
if ftStemErr='' then ftStemErr='ReturnErr.'
call value ftStem'0', 0
Signal ON Error name FileTreeErr; Signal ON Halt name FileTreeErr
Signal ON Novalue name FileTreeErr; Signal ON Failure name FileTreeErr; Signal ON Notready name FileTreeErr
interpret "address system 'dir """ftFileActual""" "ftScanSubDirOptions"' with output stem "ftStem" error stem "ftStemErr
drop ftFileActual ftStem ftScanSubDirOptions ftNumberOfAttempts
return

FileTreeErr:
if ftNumberOfAttempts>0 then do /* Иногда возникает ошибка ОС, это костыль для неё */
ftNumberOfAttempts=ftNumberOfAttempts-1
call FileTree ftFileActual, ftStem, ftScanSubDirOptions, ftStemErr, ftNumberOfAttempts
end /* if */
return

3. Нужно работать с PID процесса. В Regina Rexx, можно только определить PID текущего процесса. Мне же нужно:
А) Найти PID процесса по маске в названии окна.
Б) Определить существует ли в настоящее время процесс с указанным PID

Для чего использую команду OS tasklist. Тут ситуация аналогичная использованию команды dir. Так же возникает ошибка. При одиночном использовании всё хорошо, но когда много процессов, примерно на 100 запусков происходит один сбой. И проблема даже не в том, что он происходит, а в том, что ловушка его не ловит.
В OS/2 для роботы с процессами есть очень хорошая библиотека, но вот под windows мне найти подобное не удалось. Может плохо искал?

ScanPidProc: Procedure Expose (!globalv)
/* Версия 2.0.0 от 23.04.2024
Ищет указанный PID среди запущенных процессов.

На входе:
?PID - PID процесса.
?NumberOfAttempts - Число попыток при ошибке. Технический параметр. [5] Иногда возникает ошибка ОС, это костыль для неё.

На выходе:
Если процесс с таким PID найден, то возвращается "1", в противном случае "0".
*/
parse arg ?PID, ?NumberOfAttempts
if ?NumberOfAttempts='' then ?NumberOfAttempts=5
_PID=0
if ?PID<>'' then do
Signal ON Error name ScanPidProcErr; Signal ON Halt name ScanPidProcErr
Signal ON Novalue name ScanPidProcErr; Signal ON Failure name ScanPidProcErr; Signal ON Notready name ScanPidProcErr
address system 'tasklist /fo csv /nh /fi "PID eq '?PID'"' with output stem TaskList. error stem TaskListErr.
if TaskList.0=1 then do
parse value TaskList.1 with '"'PrObrazName'","'PrPID'","'PrSesionName'","'PrSesionNumber'","'PrMemorySize
if PrPID=?PID then _PID=1
/*
PrObrazName - Имя образа
PrPID - PID
PrSesionName - Имя сессии
PrSesionNumber - № сессии
PrMemorySize - Память
*/
end /* if */
end /* if */
return _PID

ScanPidProcErr:
if ?NumberOfAttempts>0 then do /* Иногда возникает ошибка ОС, это костыль для неё */
?NumberOfAttempts=?NumberOfAttempts-1
call ScanPidProc ?PID, ?NumberOfAttempts
end /* if */
return 0

GetPidProc: Procedure Expose (!globalv)
/* Версия 1.0.3 от 12.08.2023
Ищет и возвращает PID запущеного процесса.

Поиск процесса происходит или по маске для заголовка окна, или по имени образа (имя файла с раширением).
Наличие одного из условий обзательно, но не контролируется.
Если приложение запущено без создания окна, то вместо имени окна выводится "Н/Д". Что не позволяет однозначно
определить нужное приложение. В этом случае ищем нужное приложение путем исключения.
Перед запуском приложения находим/собираем вектор PID уже открытых образов приложения. Запускаем приложение.
Ищем новый PID по образу которого нет в раннее собраном векторе. Не очень надёжно, но лучше пока ни чего нет.
Для процессов запущенных без окно, лучше получать PID от самого процесса.

На входе:
?MaskWin - Маска для заголовка окна, в виде строки для поиска. []
?Obraz - Имя образа (имя файла с расширением) которое ищем (одно имя, НЕ вектор). []
?User - Вектор имён юзеров у которых ищем процесс. Если опущено то у всех. []
?FilterPID - Вектор PID окон которые в случае обнаружения нужно пропускать. []
?NumberOfAttempts - Число попыток при ошибке. Технический параметр. Иногда возникает ошибка ОС, это костыль для неё.

На выходе:
PID - Вектор PID найденых процессов.
При ошибке возвращается ни чего не возвращается.
*/

parse arg ?MaskWin, ?Obraz, ?User, ?FilterPID, ?NumberOfAttempts
?MaskWin=upper_ru(?MaskWin)
if ?NumberOfAttempts='' then NumberOfAttempts=5
if ?Obraz='' then Filter=''
else Filter=' /fi "imagename eq "'?Obraz'""'
!PID=''; TaskList.0=0; TaskListErr.0=0
Signal ON Syntax name GetPidProcErr; Signal ON Error name GetPidProcErr; Signal ON Halt name GetPidProcErr
Signal ON Novalue name GetPidProcErr; Signal ON Failure name GetPidProcErr; Signal ON Notready name GetPidProcErr
address system 'tasklist /v /fo csv /nh 'Filter with output stem TaskList. error stem TaskListErr.
if TaskListErr.0=0 then do
do _n=1 to TaskList.0
/*
PrObrazName - Имя образа
PrPID - PID
PrSesionName - Имя сессии
PrSesionNumber - № сессии
PrMemorySize - Память
PrCondition - Состояние
PrUser - Пользователь
PrCPTime - Время ЦП
PrWinName - Заголовок окна
*/
parse value TaskList._n with '"'PrObrazName'","'PrPID'","'PrSesionName'","'PrSesionNumber'","'PrMemorySize'","'PrCondition'","'.''PrUser'","'PrCPTime'","'PrWinName'"'
if PrObrazName=?Obraz | ?Obraz='' then do
if ?User='' then rc=1
else do
rc=0
do _u=1 to words(?User)
if PrUser=word(?User, _u) then do
rc=1
leave _u
end /* if */
end _u
end /* if else */
if rc=1 then if pos(?MaskWin, upper_ru(PrWinName))>0 | ?MaskWin='' then if wordpos(PrPID, ?FilterPID)=0 then !Pid=!PID' 'PrPID
end /* if */
end _n
end /* if */
return strip(!PID)

GetPidProcErr:
if ?NumberOfAttempts>0 then do /* Иногда возникает ошибка ОС, это костыль для неё */
?NumberOfAttempts=?NumberOfAttempts-1
call GetPidProc ?MaskWin, ?Obraz, ?User, ?FilterPID, ?NumberOfAttempts
end /* if */
return

Sun 19 May 2024 18:19 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.