Windows’95 и Windows NT, Сходства и различия, страница 4


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

Представьте, например, математическое приложение, в котором необходимо выполнить сложные вычисления над каждым элементом двухмерного массива (матрицы). Простейший способ сделать это — реализовать цикл, последовательно выполняющий эти вычисления. В 16-разрядной Windows такой подход был строго запрещен; во время выполнения цикла никакие другие приложения не могли управлять процессором, и компьютер фактически "замерзал". В Win32 совершено законно можно установить отдельный поток, выполняющий эти вычисления, в то время как главный поток приложения будет продолжать обрабатывать все сообщения, принимаемые приложением. Единственное влияние на систему — некоторое снижение производительности, что естественно при проведении сложных вычислений с интенсивной обработкой. Поток, осуществляющий вычисления, не имеет ни окон, ни очереди сообщений, ни цикла сообщений; он выполняет только одно — собственные вычисления.

В MFC эти потоки приобретают имя своего владельца; они называются рабочими потоками, в противоположность более совершенным, обрабатывающим очередь сообщений— потокам пользовательского интерфейса.

Вызов функций Windows

Хотя существование цикла сообщений — это, возможно, самая характерная черта приложений Windows, это не единственный механизм, посредством которого приложение взаимодействует с Windows. Windows, как и другие операционные системы, предлагает огромное количество системных вызовов для выполнения большого разнообразия задач, включая управление потоками, работу с окнами, обработку файлов, управление памятью, графический сервис, коммуникацию и много других функций.

Основное множество системных вызовов Windows можно разделить на три главных категории. Службы ядра включают системные вызовы для управления процессами и потоками, управления ресурсами, файлами и памятью. Службы пользователя включают в себя системные вызовы для управления элементами пользовательского интерфейса, такими как окна, элементы управления, диалоговые окна или сообщения. Службы GDI (Graphics Device Interface — интерфейс графических устройств) предлагают аппаратно независимые функции графического вывода.

Windows также включает разносторонние пользовательские интерфейсы программирования приложений (API — Application Programming Interface). Существуют отдельные API для множества задач, например, MAPI (Messaging API), TAP1 (Telephony API) или ODBC (Open Database Connectivity). Степень интеграции этих API с ядром системы различна; например, компонентная объектная модель (Component Object Model (СОМ) — основа ActiveX и OLE), хотя и реализована в форме системных библиотек DLL, тем не менее считается частью ядра функциональных возможностей Windows; другие API, такие как WinSock, считаются дополнениями или расширениями.

Эти различия между тем, что является ядром и что нет, довольно относительны. В действительности, с позиции приложений существует небольшое отличие между функциями API, являющимися частью модуля Kernel, и функциями, реализованными в DLL. Ничего не иллюстрирует это лучше, чем соглашение, используемое в языке программирования Visual Basic для вызова функций API. Все функции API объявляются одинаково, как функции во внешней DLL. Единственное отличие — в имени модуля: Kernel (ядро) при вызове ядра системы и имя DLL при вызове функций DLL.

Службы ядра

Служба ядра обычно относится к категории управления файлами, памятью, процессами, потоками и ресурсами. Хотя этот список далеко не полный, эти категории все же описывают самые часто используемые функции модуля Kernel.

Предпочтительный метод управления файлами отличается от обычно используемого в программах на C/C++. Вместо доступа к файлам через стандартные библиотечные функции С для потоков или низкоуровневого ввода/вывода или через классiostream, приложения должны использовать понятие Win32 файлового объекта и связанного с ним множества функций. Файловые объекты разрешают доступ к файлам способами, невозможными при использовании библиотек C/C++; примеры включают перекрывающийся ввод/вывод и размещенные в памяти файлы, используемые для взаимодействия задач.