Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли как-то определить, что Pascal Script сейчас бездействует? / 13 сообщений из 13, страница 1 из 1
11.06.2020, 17:05
    #39968313
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
Добрый день. Есть родительское приложение, которое дергает процедуры внутри PS, передавая им строковые данные, которые приходят от нескольких внешних источников. На каждый источник - своя процедура для обработки.

Судя по всему, PS устроен так, что вызов даже другой процедуры, пока работает первая, не допустим. Самое простое, видимо, сделать внешний флаг, который быдет устанавливать и сбрасывать каждая процедура внутри PS и очередь исполнения внутренних процедур снаружи. Но не хотелось бы, чтобы пользователи PS задумывались о флагах, а просто писали бы, "как обычно". Не думая о порядке выполнения как таковом.
...
Рейтинг: 0 / 0
11.06.2020, 17:15
    #39968316
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
AleksVoronezh
вызов даже другой процедуры, пока работает первая,
Вы к нему обращаетесь из разных потоков? Или делаете асинхронные вызовы?
...
Рейтинг: 0 / 0
11.06.2020, 17:44
    #39968324
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
Строго говоря, обращение к 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, просто по имени.
...
Рейтинг: 0 / 0
11.06.2020, 17:57
    #39968333
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
почему нельзя на каждый нужный сервер и т.д. повесить отдельный скрипт?
...
Рейтинг: 0 / 0
11.06.2020, 18:14
    #39968341
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
Vizit0r
почему нельзя на каждый нужный сервер и т.д. повесить отдельный скрипт?


Тогда придется изобретать велосипеды для общих переменных, как минимум. Откуда знать, как пользователь будет писать свою программу на PS?
...
Рейтинг: 0 / 0
11.06.2020, 19:18
    #39968369
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
AleksVoronezh
Каждый новый экземпляр в отдельном потоке.
А вы уверены, что PS поддерживает многопоточную работу?
...
Рейтинг: 0 / 0
11.06.2020, 19:21
    #39968371
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
_Vasilisk_
AleksVoronezh
Каждый новый экземпляр в отдельном потоке.
А вы уверены, что PS поддерживает многопоточную работу?

А он вроде поддерживает, но только если создавать отдельный экземпляр в каждом потоке.
...
Рейтинг: 0 / 0
11.06.2020, 19:34
    #39968375
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
alekcvp
только если создавать отдельный экземпляр в каждом потоке.
Это называется НЕ поддерживает
...
Рейтинг: 0 / 0
11.06.2020, 19:45
    #39968378
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
AleksVoronezh
Vizit0r
почему нельзя на каждый нужный сервер и т.д. повесить отдельный скрипт?


Тогда придется изобретать велосипеды для общих переменных, как минимум. Откуда знать, как пользователь будет писать свою программу на PS?


Вам подсказать, как прокидывать указатели на "наружные" переменные в ПС? Они-то общие для всех по определению.
...
Рейтинг: 0 / 0
11.06.2020, 20:56
    #39968394
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
Vizit0r
AleksVoronezh
пропущено...


Тогда придется изобретать велосипеды для общих переменных, как минимум. Откуда знать, как пользователь будет писать свою программу на PS?


Вам подсказать, как прокидывать указатели на "наружные" переменные в ПС? Они-то общие для всех по определению.


Спасибо, да, я это видел и даже опробовал. Но идея-то в том, что мы не знаем заранее, сколько и какого типа переменных потребуется пользователю при работе с его хотелками на PS. Не перекомпилировать же основное приложение? Да, наверное, можно что-то создавать и динамически, через вызов соотв. методов в главном приложении. Но это велосипед еще тот. Флаг, что процедура на PS завершила свою работу, и основное приложение может вызывать опять эту же или другую процедуру из PS мне пока кажется меньшим злом. Но таким нежелательным... это значит, навязывать пользователю некую парадигму оформлени процедур, отличную от чисто Паскалевской. Вот думаю, и ничего не придумывается пока получше.
...
Рейтинг: 0 / 0
11.06.2020, 20:58
    #39968395
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
_Vasilisk_
AleksVoronezh
Каждый новый экземпляр в отдельном потоке.
А вы уверены, что PS поддерживает многопоточную работу?
Разкмеется, я имел ввиду, что пункты 1-3 работают (уже сделано конечно) не в PS, а реализованы на Delphi.
...
Рейтинг: 0 / 0
13.06.2020, 19:15
    #39968862
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
Вчера на ночь сделал так. В основном приложении очередь, точнее две копии, на основе пользовательского класса, ("родная" очередь в D2006 оказалась неудобной, т.к. ее реализация старая, работает только с указателями, много лишних телодвижений ), которые заполняются синхронно при поступлении данных по каналам TCP и RS-232. В первой очереди хранится имя процедуры внутри PSScript, во второй - собственно сами данные, предназначенные для обработки этой процедурой. Занесение элементов в очереди сделано так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm3.Add_to_Queue(Function_Name_To_Get_Input_Data: String; Data_String: String); // Помещение в очередь
Begin
     Try
      CriticalSection.Enter;
      Function_Name_Queue.Enqueue(Function_Name_To_Get_Input_Data);
      Data_String_Queue.Enqueue(Data_String);
     Finally
      CriticalSection.Leave;
     End;

End;




Разумеется, Add_to_Queue вызывается из разныйх мест - сейчас по приходу данных по каналу TCP и по RS-232. Вопрос - так до сих пор и не нашел однозначного ответа, если код в критической секции занят, другой запрос просто отбрасывается, и повторные попытки нужно оформлять самостоятельно, или из другого потока запрос на выполнение процедуры будет выпонен автоматически, с определенным числом попыток например?

Выборка из очереди производится внутри самодельного таймера с интервалом 10 миллисекунд, на основе MMSystem.

Внутри таймера:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall; // Обработка очереди

begin

If PS_IS_Ready='No' Then Exit;  // Флаг доступный процедурам PS. Означает, что сейчас выполняется та или иная процеура внутри PS
If Function_Name_Queue.isEmpty Then Exit;

PS_IS_Ready:='No';  // Устанавливаем флаг
Form3.Call_PS_Function(Function_Name_Queue.Dequeue, Data_String_Queue.Dequeue, '', ''); // Вызываем процедуру обработки внутри скрипта

end;




сразу выставляется в доступной и для 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, то это будет грустно. Время реакции может колебаться в непредсказуемых пределах!
...
Рейтинг: 0 / 0
13.06.2020, 19:33
    #39968866
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-то определить, что Pascal Script сейчас бездействует?
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.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли как-то определить, что Pascal Script сейчас бездействует? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]