powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запус процедур на Delphi
7 сообщений из 7, страница 1 из 1
Запус процедур на Delphi
    #32321565
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В литературе подобное плохо объяснено, поэтому спрашиваю здесь.

Ситуация такая:
Есть компонента для работы с COM-портами. Когда чего-нибудь приходит по порту - генерится событие(процедурка).
Соответственно в этой процедурке обрабатываются данные, пришедшие по порту (идут запросы, вставка и удаление записей в IB-базе для пришедших данных из порта).
Теперь сама суть вопроса:
Выполнение этой процедурки может значительно затянуться (несколько секунд). А в это время, возможно, придет еще одна порция данных с порта - вызовется снова по событию эта процедурка и т.д.
Меня интересует, как будет распределяться память для переменных в каждой запущенной процедуре (по идее, как я понимаю, каждый раз для КАЖДОЙ ВЫПОЛНЯЕМОЙ ПРОЦЕДУРЫ создается "клон" этой процедуры в памяти со всеми ее переменными - иначе как бы реализовывалась рекурсия - к примеру).
Надо ли давать процессору выполнять что-то еще во время выполнения этой процедуры? Или пусть она сжирает весь процессор? Будут ли при этом генериться события при появлении данных по порту (предчуствую, что нет)?
Создавать ли транзакцию и Query для каждой процедуры? Стоит ли создавать Thread для каждой процедуры, или они формируются Дельфей автоматически?

В общем, как быть в данной ситуации? Может будут какие-нибудь советы? Разъясните, пожалуйста, сам механизм работы при таком запуске процедур.
Заранее, благодарен.

P.S. Delphi 5(+sp), FB 1.0.2.908
...
Рейтинг: 0 / 0
Запус процедур на Delphi
    #32322317
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть у меня подобная задача
я решал это двумя потоками и одной очередью....
в первом потоке происходит опрос порта (либо ожидаем данных оттуда, что не важно) при получении данных с порта, поток укладывает их в очередь. Второй поток занят тем что опрашивает очередь выбирает данные и пишет в базу. В итоге, все что не успел записать первый поток, это лежит в очереди. Самое главное в этом, чтобы в среднем, второй поток работал не медленее первого, а то забьешь всю память
да и еще предостережение, не используй в качестве очереди TQueue. Она не поддерживает многопоточность. В связи с этим поймаешь глюки, которые выловить ой как сложно
...
Рейтинг: 0 / 0
Запус процедур на Delphi
    #32322850
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то подобное мне и представлялось, только не знаю как организовать...
А можно ли использовать для очереди (хранения сообщений) TStringList? Из порта - будет Add, а просматривающий очередь - читать и удалять первую строчку?
Как создать два потока на Delphi (а надо ли их вообще)? В смысле, где про TThread почитать можно? Можно ли обойтись обычными событиями при приходе данных с порта, а просмотрщик событий из очереди повесить, например на Таймер? Или это коряво будет?

StarWind: Помоги, подскажи, пожалуйста, как организовать, чтоб глюков и тормозов поменьше было. Приложение довольно-таки очень критичное к глюкам (на серваке крутится и чем меньше к нему подходить, тем лучше).
...
Рейтинг: 0 / 0
Запус процедур на Delphi
    #32323818
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну твоя идея не пойдет в смысле на одном потоке.....
пока у тебя будет обрабатываться событие таймера, слстояние порта ты контролировать не будешь... а ты сам говоришь что возможна такая ситуация, когда запись будет идти достаточно долго.
TStringList тоже не пойдет для организации очереди...
вобщем надо прежде чем подобное писать, почитать про многопоточники и синхронизацию потоков. Контроллером очереди могу подетится, если хочешь.
...
Рейтинг: 0 / 0
Запус процедур на Delphi
    #32326218
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Намыль, если не сложно, контроллер очереди (хотя бы - каким макаром организовать хранение сообщений?).
Почему TStringList не прокатит?
И вообще, где можно в Инете почитать (где хорошо объяснено) про потоки?
Спасибо!
...
Рейтинг: 0 / 0
Запус процедур на Delphi
    #32326921
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу потоков, а точнее их синхронизации почитай тут . Самое главное понять как синхронизировать потоки, а чтобы создать новый... пишем наследника от TThread и переопределяем метод Execute, который и будет функцией потока. Но есть ряд причин, по которым мне не нравится этот класс и я предпочитаю пользоваться функцией CreateThread и сопутствующие ей. Их описание можно найти в хелпе по Win API, который устанавливается вместе с дельфей.

А почему не пойдет... Почитай про синхронизацию, там в кратце изложена суть проблемы. А очередь... вышлю.
Она в принципе не плохо коментирована(по крайней мере описаны все функции), так что я думаю разберешься. возможно что-то упростишь. (там вставляется куча коментариев при опмсании очереди... у меня это используется, в твоем случае может не нужно будет). Буду признателен, если найдешь глюки и сообщишь
...
Рейтинг: 0 / 0
Запус процедур на Delphi
    #32327023
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Очередь получил. Как разберусь - выложу комментарии тут и на мыло.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запус процедур на Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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