Поделиться через


Модуль простоя MAPI

Область применения: Outlook 2013 | Outlook 2016

MAPI предоставляет несколько функций, которые в совокупности называются подсистемой простоя. Эти функции позволяют клиентам, поставщикам адресных книг и поставщикам хранилищ сообщений выполнять различные задачи в медленное время сеанса или в ответ на медленное время. Например, клиенты и поставщики услуг могут отложить медленные операции или закрыть файлы, которые оставались неиспользуемых в течение длительного периода времени. Поставщики транспорта обычно не используют подсистему простоя, так как его место занимает метод IXPLogon::Idle . Дополнительные сведения см. в разделе IXPLogon::Idle.

Чтобы использовать подсистему простоя, клиенты и поставщики услуг создают функцию обратного вызова, содержащую задачи, которые должны выполняться, когда подсистема MAPI простаивает. Когда MAPI обнаруживает время простоя, он вызывает эту функцию обратного вызова. Функция обратного вызова следует прототипу FNIDLE , определенному следующим образом:

BOOL (STDAPICALLTYPE FNIDLE) (LPVOID lpvContext)

Дополнительные сведения см. в разделе FNIDLE.

Функции, составляющие подсистему простоя:

ChangeIdleRoutine

DeregisterIdleRoutine

EnableIdleRoutine

FtgRegisterIdleRoutine

MAPIDeInitIdle

MAPIInitIdle

Чтобы зарегистрировать функцию обратного вызова, клиенты и поставщики услуг вызывают функцию FtgRegisterIdleRoutine . Входные параметры включают необязательный приоритет, блок памяти, который передается функции обратного вызова в качестве входных данных, количество времени для использования любым способом и набор флагов параметров.

Клиенты и поставщики услуг могут указать приоритет в параметре priIdle , который управляет тем, как выполняется функция простоя, или указать ноль, если приоритет не является проблемой. Поскольку отрицательные числа представляют собой более высокие приоритеты, чем положительные числа или ноль, операции сжатия и поиска должны быть назначены отрицательные числа. Задачам, которые происходят один раз, следует назначить положительные номера.

Чтобы отменить регистрацию активной функции обратного вызова, клиенты и поставщики услуг вызывают функцию DeregisterIdleRoutine . Так как DeregisterIdleRoutine работает асинхронно, функция обратного вызова может вызываться в любое время во время вызова отмены регистрации и, возможно, даже после возврата DeregisterIdleRoutine .

Чтобы изменить некоторые или все характеристики функции обратного вызова, клиенты и поставщики услуг вызывают функцию ChangeIdleRoutine . ChangeIdleRoutine вносит изменения в соответствии с настройкой параметра флагов ircIdle ; ChangeIdleRoutine может изменять саму функцию, ее приоритет, параметр времени и входной параметр.

MAPI определяет состояние бездействия так же, как и операционная система, если операционная система имеет определение. В Win32 MAPI создает поток с приоритетом класса простоя для планирования неактивных задач. Этот поток отслеживает время и отправляет сообщение потоку, который выполняет задачу простоя, когда приходит время ее выполнения. Win32 планирует потоки, а не процессы. Если на рабочей станции выполняются задачи с приоритетом выше приоритета простоя, то задача простоя не должна быть запланирована для выполнения до завершения задач.

Все неактивные задачи выполняются в потоке, который называется MAPIInitIdle. MAPI имеет отдельный поток для планирования, но когда задача простоя становится допустимой, она отправляет сообщение обратно в поток инициализации, и задача простоя выполняется там. Последствия для разных типов клиентов следующие.

Потоковая модель Последствие
Однопотоковый
Это не проблема. Неактивные функции выполняются в потоке main клиента и сериализуются через цикл сообщений.
Свободнопотоковые
Функции бездействия должны быть потокобезопасны, но у клиента уже есть необходимая инфраструктура. Клиенту может вообще не потребоваться простой механизм MAPI.
Многопотоковые
Неактивная функция должна выполняться в том же потоке, который ее зарегистрировал, если она хочет использовать MAPI, OLE или любые другие COM-интерфейсы. Самый простой способ — зарегистрировать функцию простоя в MAPI, которая отправляет сообщение в нужный поток и отправляет "реальную" неактивную функцию непосредственно из цикла сообщений этого потока.