| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: ActiveX/СОМ/CORBA > Как избежать одновременного доступа к процедуре |
| Автор: oleg153 30.4.2009, 19:25 |
| Приложение работает с таблицей SQL - (Таб-1) По Таймеру : По таблице делаю Выборку и для выбраных записей выполняю расчеты (бывает долго, 2-5 сек) зависимости от результата меняю одно из полей записи. Возврат результата занимает от милисекунд до 2-5 секунд. При этом для данного приложения я сделал (ActiveX (exe) сервер) несколько методов, которые также используют теже процедуры работы с базой которые описаны в основной (VCL) форме. Чтоб избежать одновременного доступа к процедуре по событию Таймера (VCL-поток) и вызова этой процедуры (или другой, которая тоже работает с Таб-1) внешним приложением через Метод, я использовал Критическую Секцию и выполняю процедуры как через метод описаный в библиотеке, так и в основной форме по таймеру только отработав вход -выход в Критическую секцию. Думал это поможет , НО ВСЕ РАВНО ПРОИСХОДИТ ОДНОВРЕМЕННЫЙ ДОСТУП К ДАННЫМ , значит критическая секция или не действует или что-то я не понимаю. Подскажите КАК сделать так чтоб при наличии нескольких процедур, которые могут вызываться в основной форме и извне, не происходил одновременный запуск , что рушит базу (вернее возникает сбой) |
| Автор: Rrader 1.5.2009, 07:57 | ||
Скорее второе. Можете показать Ваш примерный код работы с секцией? |
| Автор: oleg153 4.5.2009, 15:03 | ||||
В основной форме
Смоделировал ошибку. Если procedure: SetData1 вызывается из Основной формы, а SetData2 из Клиентского приложения, тогда : - Если пауза ( Sleep() ) отрабатывается в Основной форме - тогда при попытке исполнить Клиентом SetData2 - он не исполняется, ждет отработки SetData1. - Если пауза исполняется на ВНЕШНЕМ сом-сервере к которому подключаю Основной, и на этом 2-ом сервере отрабатывается пауза (это аналок действий которые на нем отрабатываются в реали и требуют время) - тогда по неясным пока мне причинам Защита через Критическую секцию работать перестает, и можно исполнить SetData2 ДО окончания исполнения SetData1. При этом SetData1 и SetData2 работают с одним набором данных и НЕЛЬЗЯ чтоб SetData2 мог исполниться до ПОЛНОГО исполнения SetData1 Добавлено через 2 минуты и 43 секунды Конечно при описании метода который использует SetData2 я также использую Крит. секцию.
|