Для того, чтобы увеличить масштабируемость Ваших приложений, Visual FoxPro предоставляет объекты SingleUse и модель Apartment Threading как пути управления проблемами блокирования вызовов.
Объекты SingleUse
Вы можете заставить каждый экземпляр класса OLEPUBLIC выполняться в отдельном экземпляре Вашего компонента, установив у свойства "Instancing" класса OLEPUBLIC значение "SingleUse" в диалоговом окне "Project Info". Это означает, что даже притом, что Ваш компонент является одно-потоковым, каждый экземпляр SingleUse класса имеет свой собственный поток исполнения. Поведение объектов SingleUse отличается для .exe и .dll серверов.
Объекты SingleUse в EXE серверах
Когда свойство "Instancing" установлено в значение "SingleUse", каждый экземпляр объекта порождает новый процесс EXE. В версии Windows 2000 или старше, Вы будете видеть каждый запущенный процесс в менеджере задач (Task Manager). При установке значения "MultiUse", первый экземпляр порождает новый процесс, но каждый последующий экземпляр разделяет (включается) в тот же самый первый процесс.
Объекты SingleUse в DLL серверах
Значение свойства "Instancing" игнорируется для многопотоковых .dlls и только читается для run-time библиотеки VFP9R.dll. Серверы, построенные для использования с run-time библиотеками VFPVersionNumberT.dll, где VersionNumber это номер версии FoxPro, всегда работают в режиме "MultiUse" вне зависимости от их настройки. В основном, Вы должны всегда устанавливать свойство "Instancing" в значение "MultiUse" для VFPVersionNumberR.dll in-process серверов. Если Вы установите значение "SingleUse", то только один экземпляр объекта этого сервера сможет быть создан. Вы получите сообщение об ошибке, если попытаетесь создать большее количество экземпляров объектов.
В исключительно редких случаях у Вас может возникнуть желание использовать установку "SingleUse". Фактически, Microsoft Transaction Server компонент требует установки "MultiUse". Объекты "SingleUse" зачастую требуют значительно больше памяти, чем многопользовательские объекты в многопоточных компонентах. Однако существуют причины, по которым Вы можете захотеть использовать объекты "SingleUse". Например, Вы можете изолировать рискованные операции в выделенных процессах объектов "SingleUse". Если в объекте происходит критическая ошибка, то другие процессы останутся не затронутыми этой ошибкой. В то время как возникновение критической ошибки в многопоточном компоненте уничтожает все потоки.
Модель Apartment Threading
Сервер автоматизации Visual FoxPro теперь поддерживает модель Apartment threading. "Microsoft Transaction Server" использует apartment-threaded сервера и предоставляет лучшую защиту и масштабируемость, используя распаралеливание (serialization) и выстраивание (marshaling) процессов.
В Visual FoxPro модель apartment threading обеспечивает безопасность процесса. В модели apartment threading, каждый процесс (thread) подобен apartment, поскольку все объекты создаются в одном процессе, живущем в этом apartment, и не затрагивают объекты из других apartment. Каждый объект модели Apartment (такой как сервера автоматизации Visual FoxPro) может существовать только в одном процессе, процессе, который создал объект. Однако, объектный сервер (такой как Microsoft Transaction Server) может поддерживать множество объектов, формируемых разными процессами. Общие данные, используемые объектным сервером, должны быть защищены от конфликтов использования нескольких процессов.
Модель Apartment threading предоставляет следующие преимущества:
-
Все объекты, которые клиент создает в данном процессе, создаются в том же самом apartment (процессе) в DLL. Запросы к одному и тому же процессу этих объектов не требует создания cross-thread marshaling, делая их, таким образом, более эффективными.
-
Поскольку объекты получают только доступ к процессу, в котором они были созданы, то все вызовы преобразуются в последовательность вызовов таким образом, чтобы вызов от одного объекта никогда не прерывался вызовом от другого.
-
Параметры для cross-thread вызовов собираются в одном месте, и вызывающий процесс блокируется. Подобная синхронизация данных защищает структуру исполняемых процессов.
Apartment-threaded DLL не могут создавать свои собственные процессы; когда процесс клиента в первый раз требует объект, предоставляемый Вашей библиотекой DLL, создается новый apartment, и объект выполняет событие Init для этого apartment. Все одиночные процессы от объектов, которые потребуются клиенту, будут существовать в том же самом apartment, и совместно использовать глобальные данные. Любые частные (PRIVATE) объекты (включая формы), созданные глобальными объектами также будут существовать в том же самом apartment.
Хотя Visual FoxPro не предоставляет возможность доступа между разными apartment, многопользовательский клиент может получить ссылку на объект процесса A, и передать ему ссылку на объект процесса B.
Для получения дополнительной информации о модели Apartment threading, смотрите "Apartment-Model Threading" в библиотеке MSDN.
Использование Visual FoxPro модели Apartment threading исключает конфликты в процессе доступа к глобальным данным, из множества процессов предоставляя каждому apartment свою собственную копию глобальных данных. Таким образом, все объекты, созданные процессом, существуют в этом apartment, и не затрагивают объекты в других apartment.
Visual FoxPro использует локальное хранение данных процесса для того, чтобы сохранить уникальные настройки приложения и глобального окружения данных для каждого процесса (apartment). Это означает, что два экземпляра одного и того же класса созданного в разных процессах не могут получить доступ к данным друг друга. Однако если те же два экземпляра созданы в том же процессе, то каждый объект может получить доступ к данным другого объекта. Это может создавать проблемы для Вашего приложения. Фактически, два объекта создаются в одном процессе на основе одного OLEPUBLIC класса в том же .dll сервере, поэтому могут свободно обмениваться собственными данными между собой. Замечание: Вы можете использовать класс Session для того, чтобы предоставить каждому объекту уникальную частную сессию данных.
В дополнении к локальным данным процесса, Visual FoxPro также обеспечивает каждый проект (.dll) уникальной настройкой глобальных данных. Объекты, созданные в разных проектах (.dll серверах) не имеют доступа к глобальным данным друг друга, даже если они созданы в одном процессе.
Смотрите также
© Microsoft Corporation. All rights reserved.Перевод выполнил Владимир Максимов