-
В общем, через потоки сделал, чтение контактов можно прервать.
Но при вызове MsgStore.OpenEntry, где MsgStore - это либо Public Folders, либо ящик пользователя на сервере Exchange при отсутствии подключения к серверу, получается такая ситуация:
- Сначала происходит долгий висяк (~5-10мин.) - Затем возвращается ошибка MAPI_E_FAILONEPROVIDER
Если подключение к серверу есть, то все нормально.
Так вот такой вопрос: почему так надолго зависает и как этого избежать?
-
И самое интересное: если это все запхать в поток и по таймауту попробовать убить поток, то прогамма виснет :(
-
Мы использовали нитки без окон, а в Дельфи к ниткам окно привязано - может поэтому виснет. (Использовали АПИшную ::TerminateThread(hThread, 0);)
-
Спасибо, буду пробовать ;)
-
Короче, не подходит мне такой способ, даже Personal Folders не читаются, а TerminateThread вообще не рекомендуется использовать.
Я так понимаю, при запросе MsgStore происходит попытка подключения к серверу, а как можно ли заставить в пределах сессии не пытаться получать доступ к серверу, если по опр. таймауту не подключились?
-
Не рекомендуется TerminateThread - а что делать? (С этим кодом продукт уже 10 лет на рынке и ничего) А если подключились и происходит обрыв - тогда висяк (и только TerminateThread)! В реальной жизни, думаю, не так часто происходят такие события, если все правильно организовано.
-
> Не рекомендуется TerminateThread - а что делать?
Да, согласен, нарвеное ничего больше нельзя сделать :( Просто меня волнует, что утечка памяти будет при таком подходе :(
Самое интересное, что у Microsoft это нигде не документировано (по крайней мере я не нашел) и даже Outlook 2003 виснет на 2-3 мин если пропробовать развернуть узел All Public Folders ;)
-
> утечка памяти будет
Если не много памяти использовать в нитке (и нитка на чистом API), то утечка небольшая. Это просто протестировать надо.
|