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

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


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

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


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


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


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


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


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


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