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

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

MAPI: висяк при обрыве соединения [D7, WinXP]


Страницы:   1 2

AlexKung ©   (2008-07-08 14:24:00) 

Работаю с Exchange Server через Extended MAPI, читаю GAL. Указатели на интерфейсы не уничтожаю в течении сессии.

Так вот в чем проблема: если во время сессии выдернуть сетевой кабель или как-то по-другому разовать соеднение с Exchange, прорамма виснет намертво.

В чем может быть проблема?


SergeyIT   (2008-07-24 09:47:00) [1]


> утечка памяти будет

Если не много памяти использовать в нитке (и нитка на чистом API), то утечка небольшая. Это просто протестировать надо.


AlexKung   (2008-07-23 22:14:00) [2]


> Не рекомендуется TerminateThread - а что делать?

Да, согласен, нарвеное ничего больше нельзя сделать :(
Просто меня волнует, что утечка памяти будет при таком подходе :(

Самое интересное, что у Microsoft это нигде не документировано (по крайней мере я не нашел) и даже Outlook 2003 виснет на 2-3 мин если пропробовать развернуть узел All Public Folders ;)


SergeyIT   (2008-07-21 19:24:00) [3]

Не рекомендуется TerminateThread - а что делать?
(С этим кодом продукт уже 10 лет на рынке и ничего)
А если подключились и происходит обрыв - тогда висяк (и только TerminateThread)!
В реальной жизни, думаю, не так часто происходят такие события, если все правильно организовано.


AlexKung   (2008-07-21 18:55:00) [4]

Короче, не подходит мне такой способ, даже Personal Folders не читаются, а TerminateThread вообще не рекомендуется использовать.

Я так понимаю, при запросе MsgStore происходит попытка подключения к серверу, а как можно ли заставить в пределах сессии не пытаться получать доступ к серверу, если по опр. таймауту не подключились?


AlexKung   (2008-07-19 12:11:00) [5]

Спасибо, буду пробовать ;)


SergeyIT   (2008-07-18 22:20:00) [6]

Мы использовали нитки без окон, а в Дельфи к ниткам окно привязано - может поэтому виснет.
(Использовали АПИшную ::TerminateThread(hThread, 0);)


AlexKung   (2008-07-18 14:44:00) [7]

И самое интересное: если это все запхать в поток и по таймауту попробовать убить поток, то прогамма виснет :(


AlexKung   (2008-07-18 14:42:00) [8]

В общем, через потоки сделал, чтение контактов можно прервать.

Но при вызове MsgStore.OpenEntry, где MsgStore - это либо Public Folders, либо ящик пользователя на сервере Exchange при отсутствии подключения к серверу, получается такая ситуация:

- Сначала происходит долгий висяк (~5-10мин.)
- Затем возвращается ошибка MAPI_E_FAILONEPROVIDER

Если подключение к серверу есть, то все нормально.

Так вот такой вопрос: почему так надолго зависает и как этого избежать?


SergeyIT   (2008-07-09 00:34:00) [9]


> не "кошерно"

Согласен. Но другого мы тогда не нашли. (Решили видимо - нечего выдергивать сетевой кабель!)
Найдете чего - отпишитесь.


AlexKung   (2008-07-09 00:29:00) [10]

Понятно, вообще я тоже про отдельный поток думал, но думал, что это не "кошерно" ;)


SergeyIT   (2008-07-08 22:38:00) [11]

10 лет назад мы не нашли другого варианта. И работало только с Exchange sеrver'ом
Как сейчас - не знаю (Правда программа до сих пор продается и я не думаю что там что-то меняли).


AlexKung   (2008-07-08 22:32:00) [12]

Интересно было бы узнать, почему происходит зависание, ведь интерейсы реализуются dll MAPI, неужели там не реализована такая ситуация?


AlexKung   (2008-07-08 22:30:00) [13]

Ага, значит это нужно делать отдельным потоком, иначе никак?


SergeyIT   (2008-07-08 22:08:00) [14]

Посмотреть - слишком много кода и с OWL (BC 5).
1. Создается диалог (с треевью)
2. Создается нитка с выбором всего дерева мессадж_сторе
3. В диалоге по АйдлеАкшн проверяется состояние и добавляются новые ноды в трее и проверяется таймаут.
4. Если за таймаут новых сторе не получено - KillThread
Примерно так.
То есть, как и у Вас действительно соединение зависает.


AlexKung   (2008-07-08 21:16:00) [15]


> Нашел вызов из Дельфи функции длл (на С++) - выбора ящика
> с сервера. Передаю туда таймаут в секундах. А вот текста
> длл пока не нашел - дома посмотрю.

Было бы неплохо посмотреть, как это реализовано... ;)


SergeyIT   (2008-07-08 19:37:00) [16]

Нашел вызов из Дельфи функции длл (на С++) - выбора ящика с сервера. Передаю туда таймаут в секундах. А вот текста длл пока не нашел - дома посмотрю.


AlexKung   (2008-07-08 19:30:00) [17]

Кстати, по ящикам не зависает, именно при чтении GAL Exchange...


AlexKung   (2008-07-08 19:29:00) [18]


> Лет 10 назад делал подобное (только по ящикам), но не помню
> подробностей - был ли таймаут на другие функции или зависало
> (посмотрю, может где код остался - я его из МС примера делал
> - построение дерева ящиков на сервере)

Буду очень благодарен "независающему" примерчику ;)


SergeyIT   (2008-07-08 19:24:00) [19]

Лет 10 назад делал подобное (только по ящикам), но не помню подробностей - был ли таймаут на другие функции или зависало (посмотрю, может где код остался - я его из МС примера делал - построение дерева ящиков на сервере)


AlexKung   (2008-07-08 19:18:00) [20]

И Release не делаю.


Страницы:   1 2

Наверх

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