|
Программирование >> Руководство по созданию web приложений
Далее в буфер записывается завершающий фрагмент ; формиру- емого документа HTML, после чего содержимое буфера отправляется браузеру посетителя при помощи функции BeraerSupaort strcat(s2Butr, </B(3PY><-/HliL> ); HSE REQ SEND RESPONSE HEADER, NULL, NULL, {LP0il0RD>3z3aff)) return HSE STATUS ERROR; определеи в в листинге 7-14. am.c на прилагаемом к = 200; return Исходный текст функции , исходный текст которого Листинг 7-14 хранится в файле книге компакт-диске. Функция . 1с во многом аналогична функции шат консольной программы ODBCPARAM, о которой мы рассказывали в главе на- шей книги, мы поговорим об отличиях. Нриложение написано на языке С, а не С++, поэтому мы отказались от использования библиотеки шаблонов .РГРи типа данных string. об ошибке записывается в переменную sErrMsg, объявленную в odbcparam.c как extern: extern char Прототип функции : а приведен ниже: int char* aha г szRights); Через первый параметр ей передается указатель на строку идентификатора пользователя, через второй - указатель на строку пароля, а третий - ука- затель на буфер, куда функция aet maiiafl г stable должна записать результат своей работы пользователя). Далее функция выполняет инициализирующие действия, необходимые для работы с . данных через интерфейс ODBC и I - - с этим = . NULL, I с . - - ... szDSN, hEnv, Здесь мы убрали обработку ошибок, выполняемую функциями РатЕггогИаа и GetErrorMsgConn. Глава 7. CGI и ISAPI сервера Web На следующем этапе функция выполняет привязку пара- метровивызовхранимой , .ManagerLogin: SQL CHAR, 50, О, 50, О, 16, О, SQL С CHAR, Значения входных при этом копируются из параметров szUserlD и szUserPassword функции Результат работы хранимой процедуры по адресу, который был передан функции getiiar-age rtabls через последний параметр: szAdminRights); hDbc); Далее а.. >, освобождает полученные ей ресурсы и - управление. Исходные тексты функций и текстам, использованным в программе ODBCPARAM. Мы внесли в них небольшие изменения; теперь сообщение об ошибке будет отображаться не в окне консольной программы, а в документе IITMI Кроме того, вместо переменной класса string, определенного в библиотеке шаблонов STL, мы использовали здесь обычные функции . . библиотеки С. Обращение к безе данных в I потоке в предыдущем разделе для запуска хранимой процедуры мы обращались к функциям ODBC непосредственно из функции Од-способ, хотя и работает, обладает одним существенным недостатком. Этот недостаток связан с тем способом, которым сервер Microsoft Internet Inforraation Server обрабатывает запросы, получаемые от браузеров посетителей протокол HTTP. Для таких запросов сервер IIS создает пул идентификаторов потоков, обрабатывающих запросы. все потоки из этого пула заняты или находятся в состоянии ожидания, сервер отвергает вновь поступающие Чтобы этого не происходило, запросы к базам данных или другим сервисам, отнимающие много времени, лучше обрабатывать в отдельных потоках. Нри strcat(szBuff, User: Дал еефункцияН11р Ext ensionPro с запускаетфуикциюТйгеаёРгосв отдельном потоке, передавая ей в качестве параметра указатель на блок ЕСВ; О, ThreadProc, laEaB, fi, icteTarearilO}; Для запуска используется функция CreataThread. После запуска потока эта функция сразу же возвращает управление. Далее функция HttpExtensionProc увеличивает на единицу счетчик запущенных потоков (который Вы можете использовать для статистики), а затем управление: return Важно, что при этом функция HttpExtensionProc, возвращая значение HSESTA-Т не закрывает сеанс, а оставляет его открытым. В результате сеанс взаимодействия браузера посетителя в сервером остается незаверщенным, несмотря на то, что функция HttpExtensionProc закончила свою работу. Заверщение сеанса при этом на функцию ТЕ readi - в потоке. этом поток, запрос от браузера, запустит поток обращения к базе данных и быстро соответствующий слот пула потоков для обработки других запросов. Для иллюстрации того, как нужно выполнять вызов функций к базам данных из отдельного потока, мы подготовили второй вариант только что рассмотренного приложения Исходный текст главного модуля, измененный для использования i ; потока, мы привели в листинге Листинг 7-1S хранится в файле на прилагаемом к книге компакт-диске. Рассмотрим внесенные изменения. В области глобальных переменных мы определили переменные и 0 i1 iThreacif:auiit; DWORD dwThreadID; DWORD q daihreadC{iunt = 0; Первая из них предназначена для хранения идентификатора потока, создаваемого для обращения к базе данных, а вторая служит счетчиком потоков. Формирование буфера выходного документа НТМТ, в два при- ема, Вначале функция HttpExtaaaicnPrac записывает в начальный фрагмент документа без заголовка:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |