|
|
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть родительское приложение, которое дергает процедуры внутри PS, передавая им строковые данные, которые приходят от нескольких внешних источников. На каждый источник - своя процедура для обработки. Судя по всему, PS устроен так, что вызов даже другой процедуры, пока работает первая, не допустим. Самое простое, видимо, сделать внешний флаг, который быдет устанавливать и сбрасывать каждая процедура внутри PS и очередь исполнения внутренних процедур снаружи. Но не хотелось бы, чтобы пользователи PS задумывались о флагах, а просто писали бы, "как обычно". Не думая о порядке выполнения как таковом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 17:05 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh вызов даже другой процедуры, пока работает первая, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 17:15 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
Строго говоря, обращение к PS возможно из трех "мест". 1. Создается UDP "серверы" и "клиеныт" на базе Synapse (m_pSocket := TUDPBlockSocket.Create;) Каждый новый экземпляр в отдельном потоке. 2. Создаются TCP серверы и клиенты на базе Indy 10 + его же Antifreeze. Тут, я понимаю, отдельные потоки создаются автоматическии. 3. Просто создаются экземпляры Cport.TComPort. Вот тут честно говоря не знаю. С несколькими экземплярами (разными COM-портами) работу пока толком не проверял. Но, например, два разных TCP сервера исправно принимают данные, разумеется, если их повесить на разные IP-порты. И заставлять обрабатывать данные в PS по-очереди. Даллее, по приходу данных, по любому из каналов, с помощью PSScript1.GetProcMethod(Function_Name) дергается соответвующая процедура из PS, просто по имени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 17:44 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
почему нельзя на каждый нужный сервер и т.д. повесить отдельный скрипт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 17:57 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
Vizit0r почему нельзя на каждый нужный сервер и т.д. повесить отдельный скрипт? Тогда придется изобретать велосипеды для общих переменных, как минимум. Откуда знать, как пользователь будет писать свою программу на PS? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 18:14 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh Каждый новый экземпляр в отдельном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 19:18 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ AleksVoronezh Каждый новый экземпляр в отдельном потоке. А он вроде поддерживает, но только если создавать отдельный экземпляр в каждом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 19:21 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
alekcvp только если создавать отдельный экземпляр в каждом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 19:34 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh Vizit0r почему нельзя на каждый нужный сервер и т.д. повесить отдельный скрипт? Тогда придется изобретать велосипеды для общих переменных, как минимум. Откуда знать, как пользователь будет писать свою программу на PS? Вам подсказать, как прокидывать указатели на "наружные" переменные в ПС? Они-то общие для всех по определению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 19:45 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
Vizit0r AleksVoronezh пропущено... Тогда придется изобретать велосипеды для общих переменных, как минимум. Откуда знать, как пользователь будет писать свою программу на PS? Вам подсказать, как прокидывать указатели на "наружные" переменные в ПС? Они-то общие для всех по определению. Спасибо, да, я это видел и даже опробовал. Но идея-то в том, что мы не знаем заранее, сколько и какого типа переменных потребуется пользователю при работе с его хотелками на PS. Не перекомпилировать же основное приложение? Да, наверное, можно что-то создавать и динамически, через вызов соотв. методов в главном приложении. Но это велосипед еще тот. Флаг, что процедура на PS завершила свою работу, и основное приложение может вызывать опять эту же или другую процедуру из PS мне пока кажется меньшим злом. Но таким нежелательным... это значит, навязывать пользователю некую парадигму оформлени процедур, отличную от чисто Паскалевской. Вот думаю, и ничего не придумывается пока получше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 20:56 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ AleksVoronezh Каждый новый экземпляр в отдельном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2020, 20:58 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
Вчера на ночь сделал так. В основном приложении очередь, точнее две копии, на основе пользовательского класса, ("родная" очередь в D2006 оказалась неудобной, т.к. ее реализация старая, работает только с указателями, много лишних телодвижений ), которые заполняются синхронно при поступлении данных по каналам TCP и RS-232. В первой очереди хранится имя процедуры внутри PSScript, во второй - собственно сами данные, предназначенные для обработки этой процедурой. Занесение элементов в очереди сделано так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Разумеется, Add_to_Queue вызывается из разныйх мест - сейчас по приходу данных по каналу TCP и по RS-232. Вопрос - так до сих пор и не нашел однозначного ответа, если код в критической секции занят, другой запрос просто отбрасывается, и повторные попытки нужно оформлять самостоятельно, или из другого потока запрос на выполнение процедуры будет выпонен автоматически, с определенным числом попыток например? Выборка из очереди производится внутри самодельного таймера с интервалом 10 миллисекунд, на основе MMSystem. Внутри таймера: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. сразу выставляется в доступной и для PSScript внешней переменной - PS_IS_Ready:='No'. Внутри обрабатывающих процедур, уже в PSScript, при окончании работы процедуры ставится PS_IS_Ready:='Yes' Код отработал несколько часов, данные от прибора поступали со скоростью 115200 по RS-232 десять раз в секунду. Посылки около 64 байт. Число посылок от прибора и на него - по 233 тысячи. При этом по TCP тоже были редкие посылки, до 300 примерно за все время, которые также были корректно обработаны соотв. процедурой внутри скрипта. Все вроде отработало, но есть ощущение, что что-то сделано не правильно, нужно как-то по другомую. Буду рад любым замечаниям. Создавать экземпляр PSScript отдельного потока здесь пожалуй не получится - кто знает, как пользователь будет писать свою программу и какие общие переменные захочет использовать внутри скрипта. Прокидывать в PSScript или как-то создавать динамически во внешнем приложении заранее не извесное число переменных неизвестно какого типа - велосипед будет тот еще. Хотелось бы, что бы пользователь скрипта писал с минимальными понятиями о том, как это все снаружи устроено. Да, заметил еще такую вещь. Внутри скрипта есть еще отдельная процедура, которая никак пока не оформлена флагами. Она (сейчас по крайней мере) может быть вызвана не из очереди, а сама по себе. Эта процедура оправляет данные по TCP, дергая в свою очередь нужную процедуру в основном приложении. При этом, как будто ошибок не возникает. У меня вообще такое ощущение, что в данной ситуации PSScript "сам" приостанавливает выполнение текущей процедуры, например по обработке данных от RS-232, а потом возвращается к ней автоматически. Что-то вроде стека. Глюк это или приятная фича - пока не понятно. Если нам нужно как можно быстрее отправить команду на включение света, например, и посылка по TCP уйдет на умное реле, на долю секунды приостановив работу других процедур, то это не страшно. Но если при этом, при частом использовании, вылезут побочные эффекты и потребуется ввседение очереди уже и внутри PSScript, то это будет грустно. Время реакции может колебаться в непредсказуемых пределах! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2020, 19:15 |
|
||
|
Можно ли как-то определить, что Pascal Script сейчас бездействует?
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh Вопрос - так до сих пор и не нашел однозначного ответа, если код в критической секции занят, другой запрос просто отбрасывается, и повторные попытки нужно оформлять самостоятельно, или из другого потока запрос на выполнение процедуры будет выпонен автоматически, с определенным числом попыток например? HelpCall Enter to block all other threads from entering code protected by this critical section until the Leave or Release method is called. Enter calls the Acquire method to bind the critical section to the calling thread. Другой запрос тупо "зависнет" на вызове Enter, пока работающий не вызовет Leave. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2020, 19:33 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39968313&tid=2038224]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
153ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 436ms |

| 0 / 0 |
