![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MAPI: висяк при обрыве соединения [D7, WinXP]
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 не делаю.