Для тех, кого интересует дальнейшее развитие бесплатных программ, выложенных на сайте, имеется возможность ознакомиться с исходниками. Ниже приводится краткое описание некоторых из них, которое по идее должно помочь при разборке исходного кода...
SQL Monitor |
Идея была проста - получить список процессов, блокирующих друг друга и по этой информации построить дерево процессов с возможностью отстрелить нужный. При этом, в дереве хотелось бы по каждому процессу видеть полезную информацию о том, что именно привело к блокировке и кто владеет каждым процессом.
Для общения с сервером использовались ADO компоненты, хотя наверняка можно было бы найти более легкое решение, например используя библиотеки прямого доступа. Но, что есть - то есть. Доступ к серверу выполняется на основе ConnectionString, которая формируется при вызове функции GetConnectStr с именем сервера в качестве параметра. Я использовал в этой строке OLEDB for ODBC как самый неприхотливый протокол (чистый OLEDB слишком капризен и выдает много лишних ошибок и предупреждений. А пройдя через ODBC они просто глушатся и не доходят до пользователя). Соединение устанавливается на основе Trusted Connection (то есть Ваш системный логин должен позволять вставить процедуру в БД master и вызывать ее), но это можно изменить. В общем, эту строку Вы можете устанавливать по своему желанию...
Вся работа проводится в основной форме (TLockForm). При открытии основной формы (onFormShow) производится вытаскиваение сохраненного в INI-файле имени сервера, затем запрос списка доступных серверов и выставляется флаг автоматического опроса сервера. При этом активизируется таймер, который каждые 2 секунды запускает процедуру опроса ShowAllLocks, которая, в свою очередь, произедя очистку дерева, вызывает процедуру CreateLocksList, наполняющую дерево списком процессов, участвующих в блокировках. Список процессов получаем путем вызова хранимой процедуры __SQLLocks из БД master. Перед вызовом хранимой процедуры, делается проверка глобальной строковой переменной ProcName (при старте программы она пуста), которая является флагом наличия хранимой процедуры на сервере: если она пуста, значит нужно проверить существует ли процедура на сервере и вставить ее туда в случа е отсутствия. Проверка наличия и вставка хранимой процедуры выполняется в процедуре ChangeSQLServer (по ее названию видно, что она так же вызывается каждый раз при смене сервера).
Сама хранимая процедура несколько наворочена и даже использует курсор, но это вызвано желанием получить побольше информации о процессах...
Ну вот, собственно и все. Форма, где показываются процессы устроена примерно так же, только немного проще. Все остальные подробности - в исходном коде. Дерзайте, если не лень...
|
|
Service Scheduler |
Вся программа состоит из одного модуля TService, в который помещен таймер, срабатывающий каждые 10 секунд. При очередном срабатывании, вызывается процедура CheckService, производится считывание данных из INI-файла и занесение их в соответствующие структуры, среди которых - список служб (Services:TStringList). Далее по каждой из служб, перечисленным в списке, выполняется извлечение информации о ее расписании, вызается функция IsServiceRunning, которая определяет статус службы (запущена или остановлена), после чего вызывается функция TimeToRun, определяющая, соответствует ли статус службы заданному для нее расписанию. Ну и на основе полученной информации служба либо запускается, либо останавливается, либо не происходит ничего...
При проверке статуса службы, при ее старте и остановке используются функции из модуля ServiceControl.pas |
|
Pager Agent |
При старте программы по событию FormCreate загружаем список отделов из INI-файла в выпадающий список (TComboBox). При выборе очередного отдела из выпадающего списка, по событию OnChange, вызываем процедуру ReadDepartmentRecipients, которая загружает в TListView список абонентов с реквизитами. Проставляем флажки против тех, кому будем посылать сообщение. Набираем текст сообщения и нажимаем кнопку "Отправить". При этом вызывается процедура Send, которая в цикле по списку абонентов, по каждому из них проверяет свойство Checked и складывает отмеченных в два списка: один для требующих транслитерации, другой для остальных (для каждого из этих списков будем формировать свое сообщение). После того, как списки сформированы, для каждого из них вызываем процедуру SendPageMessage, которая, используя компонент TSakSmtp (достаточно надежный и неоднократно проверенный в работе), формирует сообщение, вставляя список абонентов в поле "Кому" и отправляет его на почтовый сервер, адрес и порт которого мы подняли из INI-файла при старте программы.
|
|
|
|
|
|
|