Образец FREETHRD: многопоточный клиент и свободнопоточный сервер с поддержкой COM в компиляторе
Обновлен: Ноябрь 2007
В этом образце демонстрируются многопоточный клиент и свободнопоточный сервер с поддержкой COM в компиляторе.
Образец состоит из следующих частей:
Freclien — многопоточный клиент
Freserve — свободнопоточный внутрипроцессный сервер
![]() |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Построение и запуск этого образца
Откройте решение 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.