RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> Чуть ранее, в другой ветке, я задавал вопрос про обмен данными между программами, работающими на 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
_, _, _, _, _ _, _,_
(_ | / \ |\ | / \ |_/
, ) | , \ / | \| \ / | \
~ ~~~ ~ ~ ~ ~ ~ ~
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.