Образец FREETHRD: многопоточный клиент и свободнопоточный сервер с поддержкой COM в компиляторе
В этом образце демонстрируются многопоточный клиент и свободнопоточный сервер с поддержкой COM в компиляторе.
Образец состоит из следующих частей:
Freclien — многопоточный клиент
Freserve — свободнопоточный внутрипроцессный сервер
![]() |
---|
Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях "КАК ЕСТЬ", без каких-либо гарантий. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
Доступ к примерам из Visual Studio
В меню Справка выберите пункт Примеры.
По умолчанию эти примеры устанавливаются в папку диск:\Program Files\Microsoft Visual Studio 10.0\Samples\.
- Самая последняя версия этого примера и полный список примеров представлены на странице Visual Studio Samples на веб-сайте MSDN.
Построение и запуск образца
Построение и запуск этого образца
Откройте решение freethrd.sln.
Постройте проект сервера, а затем проект клиента.
Настройте проект клиента как запускаемый автоматически (щелкните узел проекта правой кнопкой мыши и выберите Назначить запускаемым проектом) и запустите образец.
Принцип работы образца
Образец Freclien порождает несколько потоков для создания и использования COM-объекта COBall, предоставляемого свободнопоточным сервером Freserve. Сам объект COBall не порождает потоки; он пассивно реагирует на запросы интерфейса IBall, поступающие из всевозможных потоков клиента. Клиент Freclien создает и контролирует один объект COBall через интерфейс IBall, предоставляемый объектом. В то время как три потока Freclien перемещают шарик с помощью вызовов IBall::Move, другой, основной поток, используя системный таймер, получает регулярные обновления позиции, размера и цвета объекта COBall. Эти данные, полученные с помощью вызова IBall::GetBall, используются в основном потоке для вывода графических изображений — снимков шарика в главном окне клиента.
В образце Freserve объект COBall обновляет внутренними средствами свое свойство цвета в зависимости от последнего потока, вызвавшего метод Move для объекта. Эти данные используются потоком отображения для каждого выводимого им изображения шарика. По мере перемещения шарика его цвет меняется в зависимости от потока, перемещающего шарик. Движущийся шарик оставляет за собой след, дающий наглядное представление об истории его обработки в потоках. Этот след показывает, что в модели COM со свободными потоками все потоки, выполняющие запросы через интерфейс к одному и тому же объекту, получают доступ к объекту в вызывающем потоке. Разные цвета одного объекта шарика представляют разные вызывающие потоки.
В данном образце используется собственная поддержка COM в компиляторе. Образец предлагает пример пользовательского COM-интерфейса, выполняющего маршалинг структур RECT и POINT в модели со свободными потоками. Он демонстрирует использование атрибута exclude директивы #import.