Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DCOM-клиент и поток [Delphi, Windows]


Rext ©   (2004-12-16 16:06:00) 

Добрый день!
  Дано: трех звенная архитектура (Oracle server, сервер приложений, клиент); сервер приложений с клиентом общаются по DCOM. Клиент формирует запрос (select ла-ла-ла...) в отдельном потоке и передает его серверу приложений для исполнения.
  Вопрос: как убить поток, если запрос "завис"?
Вызов из программы процедуры Destroy для потока, приводит к "зависанию" программы, т.е. при отработке Destroy поток честно дожидается окончания работы переданного запроса. Может есть возможность передавать запрос таким образом, что бы не загручать поток?
  При создании сервера выбраны MultiInstance и Free.

Прошу прощения за возможную сумбурность, но уже 3-ий день с этой проблемой тра.юсь ...


Кролик Енерджайзер   (2005-01-14 13:55:00) [1]

2 Slym:
Да точно, а потом TerminateThread и огрести вагон ликов :)


Slym   (2005-01-14 05:15:00) [2]

Поток должен отлавливать таймауты!
А слабо корректно TimeOut у датасетов настроить?
или
Поставить Async выполнение и в самом потоке ждать тайм аута
типа (WaitableTimer или Event на конец выполнения+ WaitFor(TimeOut))...
Если запрос идет больше минуты (НА СЕРВАКЕ!!!) можно с вероятностью 95% утверждать что он завис.

А если юзер сам пишет запрос: время подумать о конструкторе запросов, который имеет в своем запасе корректные кубики и из них строить. Т.е свобода в рамках разумного!


Cobalt   (2004-12-20 23:12:00) [3]

2 Rext   (20.12.04 08:46) [3]
>   TerminateThread - это не лучший выход. Как я понимаю, после него не будет освобождена память, остануться не выгруженнымим dll и т.д.
Ситуация, в которой обращение к БД может "зависнуть" является чрезвычайным.
Предлагаю исходить из этого положения, и, соответственно, не допускать "зависания" потока.
Т.е. отлаживать архитектуру. Название статьи тебе уже написали :)


Rext   (2004-12-20 08:46:00) [4]

to Cobalt ©
  TerminateThread - это не лучший выход. Как я понимаю, после него не будет освобождена память, остануться не выгруженнымим dll и т.д.

to Кролик Енерджайзер
  Посылать имена процедур у меня не получитья. Пишется приложение типа TODA, т.е. в котором пользователь сам пишет произвольные скрипты на выбор данных из базы.

Если есть конструктивные мысли, как ЭТО сделать более умно, то с радостью приму к сведению, т.к. с DCOM-мом знаком не долго ;) .


Кролик Енерджайзер   (2004-12-17 16:59:00) [5]

<offtop>
Ох ничего себе. Клиент селекты шлёт. Ладно бы имена хранимых процедур. Но и то не лучшее решение. Клиент вообще ничего не должен знать об SQL. Рекоммендую статью

"Application Architecture for .NET: Designing Applications and Services" из MSDN раздел Designing Data Layers.

</offtop>

Проблема зависания - это issue. Я бы пересмотрел необходимость использования этого сервера приложений.


Cobalt   (2004-12-16 23:39:00) [6]

TerminateThread
+ PSAPI/ToolHelp для получения хендла (если я, конечно, ничего не напутал)


Наверх

Титульная страница Поиск, карта сайта Написать письмо