Форум: "Прочее";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
ВнизSOAP в Delphi. Что делать с зависонами Найти похожие ветки
← →
Sergey Masloff (2009-02-19 23:49) [0]Пытаемся победить проблемы Борландовского MIDAS. Так как пациент скорее мертв а кода его использующего очень много, возникла и была реализована идея.
Написан .NET WebService который умеет отдавать и принимать данные в формате пакетов ClientDataSet.
Написан клиентский софт - компонент аналог WebConnection. То есть на клиенте заменяется один компонент на проект и все остальное работает с сервисом радостно думая что работает с сервером приложений Midas. До этой поры все хорошо. Но при реальной нагрузке выяснилось следующее:
- иногда (десятые доли процента от всех вызовов) вызов подвисает
- подвисает он не на сервере (через перехватчики отслеживаются пары request-response)
- установка таймаута на клиенте (на сервере и так стоит) ничего не дает - повисшее приложение не отвисает никогда (пробовал на ночь оставлять)
=====================================================
Так как оставлять так нельзя появилась идея делать вызов в потоке (не для параллельности а просто чтобы таймаутом управлять через WaitForSingleObject).
Все получилось, теперь максимальным временем зависона можно управлять (и повторять попытку).
Остается вопрос что делать с повисшими теперь уже потоками (Thread). Попытка дать Free() приводит к зависанию (естественно) так как Terminate не получает шанса в зависшем потоке.
Оставлять зависшие потоки висящими тоже не хочется
Делать им TerminateThread некошерно - ресурсы не освобождает
Что еще попробовать?
← →
Хитрий Лис (2009-02-20 08:55) [1]Выделять ресурсы в другом потоке... и делать TerminateThread :)
← →
Sergey Masloff (2009-02-20 09:17) [2]Хитрий Лис (20.02.09 08:55) [1]
К сожалению, не получится. Там ресурсы выделяются где-то глубоко-глубоко в потрохах. Где-то не значит что я не знаю где, но это место (места) для модификации недоступны, а доступна точка входа (GetData) которая их выделяет качает данные и в случае успеха ресурсы высвобождает
← →
Хитрий Лис (2009-02-20 09:20) [3]Жаль... такая идея пропала :) а запускать в другом процессе тоже не получиться ?
А взаимодейстие процессов организовать посылкой XML-ки через WM_COPYDATA.
← →
Sergey Masloff (2009-02-20 09:38) [4]Sergey Masloff (20.02.09 09:17) [2]
В другом процессе слишком накладно... При нормальной работе пользователя таких запросов идет по несколько в секунду. Мне и идея с создаванием каждый раз отдельного потока не нравилась но вобщем-то на скорость не повлияло - все же на сетевом уровне задержки больше.
Пока картина такая - часть тредов (ориентировочно 0-5 на 1000) остается висящей. Клиент не виснет не тормозит но память постепенно отъедает. В таком виде оставлять нельзя. Уже появляется идея клиента тоже сделать .NET а дельфийский клиент с ним общался бы локально. Но это пока слишком наворочено выглядит. Идея-то была малой кровью...
← →
Dnd (2009-02-20 12:11) [5]Маслофф, здесь ты ответ вряд ли получишь. Лучше на королевстве задай вопрос (что ты, наверное, сделал) и не обломаться зарегаться в ЖЖ и на http://community.livejournal.com/ru_delphi/
← →
Dnd (2009-02-20 12:42) [6]А лучше вообще потихонечку отказываться от всего дельфового, впрочем вы по-моему так и делаете. А вопрос задавать на англоязычных форумах борланда...
← →
iZEN © (2009-02-20 17:11) [7]
> Dnd (20.02.09 12:42) [6]
>
> А лучше вообще потихонечку отказываться от всего дельфового
Ага. Потихонечку не получится — Delphi завязана на Win32, и .NET не в меньшей степени тоже. А если их скрестить, то получится жуткий кадавр. Поимеете проблем с сопровождением/обновлением такого это точно.
Лучше сразу:
http://www.ibm.com/developerworks/ru/library/dm-0712bommireddipalli/index.html
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.05 c