Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
12.11.2003, 14:43
|
|||
|---|---|---|---|
Запус процедур на Delphi |
|||
|
#18+
В литературе подобное плохо объяснено, поэтому спрашиваю здесь. Ситуация такая: Есть компонента для работы с COM-портами. Когда чего-нибудь приходит по порту - генерится событие(процедурка). Соответственно в этой процедурке обрабатываются данные, пришедшие по порту (идут запросы, вставка и удаление записей в IB-базе для пришедших данных из порта). Теперь сама суть вопроса: Выполнение этой процедурки может значительно затянуться (несколько секунд). А в это время, возможно, придет еще одна порция данных с порта - вызовется снова по событию эта процедурка и т.д. Меня интересует, как будет распределяться память для переменных в каждой запущенной процедуре (по идее, как я понимаю, каждый раз для КАЖДОЙ ВЫПОЛНЯЕМОЙ ПРОЦЕДУРЫ создается "клон" этой процедуры в памяти со всеми ее переменными - иначе как бы реализовывалась рекурсия - к примеру). Надо ли давать процессору выполнять что-то еще во время выполнения этой процедуры? Или пусть она сжирает весь процессор? Будут ли при этом генериться события при появлении данных по порту (предчуствую, что нет)? Создавать ли транзакцию и Query для каждой процедуры? Стоит ли создавать Thread для каждой процедуры, или они формируются Дельфей автоматически? В общем, как быть в данной ситуации? Может будут какие-нибудь советы? Разъясните, пожалуйста, сам механизм работы при таком запуске процедур. Заранее, благодарен. P.S. Delphi 5(+sp), FB 1.0.2.908 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.11.2003, 06:35
|
|||
|---|---|---|---|
Запус процедур на Delphi |
|||
|
#18+
есть у меня подобная задача я решал это двумя потоками и одной очередью.... в первом потоке происходит опрос порта (либо ожидаем данных оттуда, что не важно) при получении данных с порта, поток укладывает их в очередь. Второй поток занят тем что опрашивает очередь выбирает данные и пишет в базу. В итоге, все что не успел записать первый поток, это лежит в очереди. Самое главное в этом, чтобы в среднем, второй поток работал не медленее первого, а то забьешь всю память да и еще предостережение, не используй в качестве очереди TQueue. Она не поддерживает многопоточность. В связи с этим поймаешь глюки, которые выловить ой как сложно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.11.2003, 12:58
|
|||
|---|---|---|---|
Запус процедур на Delphi |
|||
|
#18+
Что-то подобное мне и представлялось, только не знаю как организовать... А можно ли использовать для очереди (хранения сообщений) TStringList? Из порта - будет Add, а просматривающий очередь - читать и удалять первую строчку? Как создать два потока на Delphi (а надо ли их вообще)? В смысле, где про TThread почитать можно? Можно ли обойтись обычными событиями при приходе данных с порта, а просмотрщик событий из очереди повесить, например на Таймер? Или это коряво будет? StarWind: Помоги, подскажи, пожалуйста, как организовать, чтоб глюков и тормозов поменьше было. Приложение довольно-таки очень критичное к глюкам (на серваке крутится и чем меньше к нему подходить, тем лучше). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.11.2003, 05:48
|
|||
|---|---|---|---|
Запус процедур на Delphi |
|||
|
#18+
ну твоя идея не пойдет в смысле на одном потоке..... пока у тебя будет обрабатываться событие таймера, слстояние порта ты контролировать не будешь... а ты сам говоришь что возможна такая ситуация, когда запись будет идти достаточно долго. TStringList тоже не пойдет для организации очереди... вобщем надо прежде чем подобное писать, почитать про многопоточники и синхронизацию потоков. Контроллером очереди могу подетится, если хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.11.2003, 14:06
|
|||
|---|---|---|---|
Запус процедур на Delphi |
|||
|
#18+
Намыль, если не сложно, контроллер очереди (хотя бы - каким макаром организовать хранение сообщений?). Почему TStringList не прокатит? И вообще, где можно в Инете почитать (где хорошо объяснено) про потоки? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.11.2003, 03:23
|
|||
|---|---|---|---|
Запус процедур на Delphi |
|||
|
#18+
по поводу потоков, а точнее их синхронизации почитай тут . Самое главное понять как синхронизировать потоки, а чтобы создать новый... пишем наследника от TThread и переопределяем метод Execute, который и будет функцией потока. Но есть ряд причин, по которым мне не нравится этот класс и я предпочитаю пользоваться функцией CreateThread и сопутствующие ей. Их описание можно найти в хелпе по Win API, который устанавливается вместе с дельфей. А почему не пойдет... Почитай про синхронизацию, там в кратце изложена суть проблемы. А очередь... вышлю. Она в принципе не плохо коментирована(по крайней мере описаны все функции), так что я думаю разберешься. возможно что-то упростишь. (там вставляется куча коментариев при опмсании очереди... у меня это используется, в твоем случае может не нужно будет). Буду признателен, если найдешь глюки и сообщишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&tablet=1&tid=2115877]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 333ms |

| 0 / 0 |
