Таймеры в Windows
Изучение служб таймеров, входящих в Microsoft Windows. Назначение основных процедур и функций выполняемых служб, назначение и смысл их входных параметров и возвращаемых значений. Решение задачи на применение службы обычных таймеров для Delphi 5.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | методичка |
Язык | русский |
Дата добавления | 09.06.2011 |
Размер файла | 44,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Методические указания
к выполнению лабораторной работы
по курсу:
"Системы реального времени"
на тему:
"Таймеры в Windows"
Таганрог 2002
1. Цель работы
Изучить службы таймеров, входящих в Microsoft Windows. Разобрать назначение основных процедур и функций этих служб, назначение и смысл их входных параметров и возвращаемых значений. Научиться применять на практике полученные знания.
2. Обозрение служб таймеров для Microsoft Windows
Таймер - внутренняя функция операционной системы, которая позволяет многократно измерять указанный интервал времени. После истечения промежутка времени, контролируемого таймером, должно выполняться то или иное действие, например вызываться на выполнение определённая программа.
Точность, с которой таймер контролирует заданный интервал времени, называется его разрешающей способностью. Точность таймера зависит от тактовой частоты системы.
Имеется два типа событий от таймера: единственное, которое происходит однажды после указанного количества миллисекунд, и периодические. Периодические вызовы по таймеру поступают неоднократно каждый раз, когда протекает указанное число миллисекунд.
Microsoft Windows поддерживает службы обычных и мультимедийных таймеров. Различие между мультимедийными и обычными таймерами состоит в том, что мультимедийные таймеры вызывают события обработки сразу, а обычные таймеры добавляют сообщение о необходимости обработки события по таймеру к очереди сообщений.
Мультимедийные таймеры работают с наибольшей точностью среди других служб таймеров и позволяют приложению намечать события с наивысшей разрешающей способностью, возможной для используемых аппаратных средств. Мультимедийные таймеры полезны для приложений, которым требуется выбор времени с высоким разрешением. Приложения не требующие высокоточного выбора времени должны использовать службу обычных таймеров.
3. Мультимедийные таймеры
3.1 Общие положения
Сервис мультимедийных таймеров позволяет намечать как однократные, так и периодические события, т.е. приложение может запрашивать и получать сообщения таймера через заданные им интервалы времени.
Как правило, прежде чем приложение начинает использовать услуги мультимедийного таймера, оно определяет текущее системное время. Системное время - это время, в миллисекундах, от начала работы операционной системы Microsoft Windows. Для определения астрономического времени используется функция GetSystemTime, а для определения системного времени - функция GetTickCount. Функция GetSystemTime заполняет структуру _SYSTEMTIME, а GetTickCount возвращает значение LongWord. Описание используемых типов данных (_SYSTEMTIME, LongWord) приводится в приложении 1.
Интервал между периодическими вызовами называется задержкой времени (uDelay). Периодические события таймера с задержкой времени в 10 миллисекунд или меньше потребляют существенную часть ресурсов процессора.
Отношение между разрешающей способностью таймера и длиной задержки времени играют важную роль в событиях от таймера. Например, если разрешающая способность равна 5 мс, а задержка времени равна 100 мс, то таймер запускает функцию вызова (lpTimeProc) в интервале от 95 до 105 миллисекунд.
Для установки мультимедийного таймера используется функция timeSetEvent, отменяет активный таймер функция timeKillEvent.
Чтобы запустить таймер, приложение должно вызвать функцию timeSetEvent, указывая в качестве параметров задержку времени, разрешающую способность, адрес функции вызова, данные пользователя (в дальнейшем они будут сообщаться функции вызова при её запуске таймером) и тип таймера (одиночный или периодический). Функция timeSetEvent возвращает идентификатор таймера, который может использоваться, чтобы остановить или идентифицировать события от таймера.
Формат функции timeSetEvent:
Function timeSetEvent (uDelay: UINT; uResolution: UINT; lpTimeProc: TFNTimeCallBack; dwUser: DWORD; fuEvent: UINT): MMRESULT,
где uDelay - задержка времени в миллисекундах; uResolution - разрешающая способность таймера, в миллисекундах; lpTimeProc - адрес функции, которая запускается при срабатывании таймера; dwUser - данные пользователя, сообщаемые вызываемой функции при срабатывании таймера (при отсутствии данных параметру присваивают нулевое значение); fuEvent - тип таймера.
Функция в случае успеха возвращает идентификатор таймера, в противоположном случае - ошибку.
Определены следующие типы таймеров (fuEvent): TIME_ONESHOT - таймер срабатывает один раз, после истечения uDelay миллисекунд; TIME_PERIODIC - таймер срабатывает периодически, после истечения каждых uDelay миллисекунд.
Разрешающая способность тем выше, чем меньше значение параметра uResolution. Разрешающая способность равная нулю указывает на то, что события должны произойти с максимально возможной точностью. Чтобы уменьшить затраты ресурсов системы, нужно использовать как можно большее значение параметра uResolution.
После инициализации таймер будет запускать функцию, адрес которой указан в параметре lpTimeProc функции timeSetEvent.
Функцию вызова обычно называют TimeProc. Формат функции TimeProc:
Procedure TimeProc (uID: UINT; uMsg: UINT; dwUser: DWORD; dw1: DWORD; dw2: DWORD) stdcall,
где uID - идентификатор таймера; uMsg - зарезервировано (не использовать); dwUser - данные пользователя, указанные в соответствующем параметре функции timeSetEvent; dw1 и dw2 - зарезервировано (не использовать).
Приставка stdcall ставится для функций и процедур, запуск которых осуществляет операционная система, а также это означает, что параметры будут считываться справа налево.
Идентификатор таймера uID возвращается функцией timeSetEvent при инициализации таймера.
Функция timeKillEvent удаляет указанный таймер. Формат функции timeKillEvent:
Function timeKillEvent (uTimerID: UINT): MMRESULT,
где uTimerID - идентификатор таймера, который следует удалить.
Идентификатор uTimerID возвращает функция timeSetEvent при инициализации таймера.
- Приложение не должно вызывать никакие системые функции внутри функции вызова TimeProc. К ним относятся: GetSystemTime, GetTickCount, timeSetEvent и timeKillEvent. В этом случае необходимо предусмотреть дополнительные функции установки и удаления таймера вне пределов процедуры TimeProc. Например, для создания таймера можно использовать функцию следующего вида:
Function BuildTimer (uDelay: UINT; uResolution:UINT; fuEvent: UINT): MMRESULT;
Begin
Result:= TimeSetEvent (uDelay, uResolution,@TimeProc, 0, fuEvent);
End;
для удаления таймера - процедуру:
Procedure DestroyTimer (Var T_ID: UINT);
Begin
TimeKillEvent (T_ID);
T_ID:= 0;
End;
Перед освобождением памяти (например, в случае завершения работы приложения), содержащей функцию вызова (lpTimeProc), необходимо выключить все активные таймеры.
3.2 Примеры использования для Delphi 5
Разберём несколько задач на применение службы мультимедийных таймеров.
Задача №1: Необходимо создать периодичный таймер TM1 с интервалом срабатывания 5 секунд, точностью 5 миллисекунд, который после запуска функции GetWorkResult и в зависимости от возвращённого этой функцией значения выполняет следующие действия:
если функция GetWorkResult вернёт 0, то запускается одиночный таймер TM2 с интервалом срабатывания 1 секунда, точностью 1 миллисекунда, который в свою очередь будет вызывать процедуру Work_TM2;
если функция GetWorkResult вернёт 1, то таймер TM1 выключается.
Разрабатываемая программа должна содержать: описание переменных, используемых в качестве идентификаторов таймеров; описание процедур и функций и основную программу.
Сначала рассмотрим функцию GetWorkResult и процедуру Work_TM2, которые вызываются при срабатывании таймеров.
Работу функции GetWorkResult реализуем с помощью обращения к счётчику равномерно распределённых случайных чисел:
Function GetWorkResult: Integer;
Begin
Result:= Random(2);
End;
В результате выполнения функции GetWorkResult возвращаемое значение (Result) будет равно 0 или 1.
Пусть процедура Work_TM2 выполняет следующие действия:
Procedure Work_TM2;
Var
I: Integer;
Begin
I:= 30000;
While I <> 0 do I:= I - 1;
End;
Поскольку сначала должен быть запущен таймер TM1, для его установки будем использовать функцию TimeSetEvent:
TM1:= timeSetEvent (5000, 5, @TimeProc, 0, TIME_PERIODIC);
Опишем процедуру TimeProc, адрес которой был указан в качестве одного из аргументов функции TimeSetEvent:
Procedure TimeProc (uTimerID, uMessage:UINT; dwUser, dw1, dw2:DWORD) stdcall;
Begin
If uTimerID = TM1 Then // сработал таймер с идентификатором TM1
Case GetWorkResult of
0:TM2:= BuildTimer (1000,1, TIME_ONESHOT);
1: DestroyTimer(TM1);
End Else Work_TM2; // сработал таймер TM2
End;
Так как внутри функции вызова TimeProc не должны вызываться системные функции timeSetEvent и timeKillEvent, для создания таймера TM2 использована функция BuildTimer, а для удаления таймера TM1 - функция DestroyTimer.
В результате код программы, соответствующий поставленной задаче, будет выглядеть следующим образом:
Var
// описание идентификаторов таймеров
TM1: UINT;
TM2: UINT;
Function GetWorkResult: Integer;
Begin
Result:= Random(2);
End;
Procedure Work_TM2;
Var
I: Integer;
Begin
I:= 30000;
While I <> 0 do I:= I - 1;
End;
Procedure DestroyTimer (Var T_ID: UINT);
Begin
TimeKillEvent (T_ID);
T_ID:= 0;
End;
Function BuildTimer (uDelay: UINT; uResolution:UINT; fuEvent: UINT): UINT;
Begin
Result:= TimeSetEvent (uDelay, uResolution,@TimeProc, 0, fuEvent);
End;
Procedure TimeProc (uTimerID, uMessage:UINT; dwUser, dw1, dw2:DWORD) stdcall;
Begin
If uTimerID = TM1 Then // сработал таймер с идентификатором TM1
Case GetWorkResult of
0:TM2:= BuildTimer (1000,1, TIME_ONESHOT);
1: DestroyTimer(TM1);
End Else Work_TM2; // сработал таймер TM2
End;
// начало основной программы
Begin
Randomize;
TM1:= timeSetEvent (5000, 5, @TimeProc, 0, TIME_PERIODIC);
// здесь подразумевается создание окон приложения
End.
Задача №2: Периодический таймер TM1 с интервалом срабатывания 10 секунд и разрешающей способностью 0.01 с, а также с автокорректировкой времени запуска (отсчёт следующего момента запуска таймера сдвигается на время выполнения процедуры или функции), срабатывает 5 раз и при срабатывании вызывает функцию GetWorkResult, возвращаемое значение которой влияет на дальнейшие события следующим образом:
если функция GetWorkResult вернёт 0, то запускается периодический таймер TM2 (с интервалом срабатывания 3 с и максимальной разрешающей способностью) на 2 срабатывания и вызывает функцию GetTM2, которая в случае GetTM2 = 0 запускает одиночный таймер TM3 (интервал срабатывания 1с, максимальная разрешающая способность), вызывающий в свою очередь процедуру Work_TM3, иначе, если GetTM2 0, никаких действий производить не следует;
если функция GetWorkResult = 1, то запускается одиночный таймер TM3 (интервал срабатывания 1с, максимальная разрешающая способность), вызывающий по срабатыванию процедуру Work_TM3.
Как и для первой задачи, разрабатываемая программа должна содержать: описание переменных, используемых в качестве идентификаторов таймеров; описание процедур и функций и основную программу.
Описание функции GetWorkResult аналогично описанию одноимённой функции из первой задачи.
Работу функции GetTM2 реализуем с помощью обращения к счётчику равномерно распределённых случайных чисел:
Function GetTM2: Integer;
Begin
Result:= Random(3);
End;
В результате выполнения функции GetTM2 возвращаемое значение (Result) будет равно 0,1 или 2.
- Работа процедуры Work_TM3 аналогична работе процедуры Work_TM2, описанной в первой задаче.
- Поскольку сначала должен быть запущен таймер TM1, для его установки будем использовать функцию TimeSetEvent:
TM1:= timeSetEvent (10000, 10, @TimeProc, 0, TIME_PERIODIC);
Опишем процедуру TimeProc, адрес которой был указан в качестве одного из аргументов функции TimeSetEvent:
Procedure TimeProc (uTimerID, uMessage:UINT; dwUser, dw1, dw2:DWORD) stdcall;
Begin
If uTimerID = TM1 Then // сработал первый таймер
Begin
C1:= C1 - 1;
If C1 = 0 Then DestroyTimer(TM1);
Case GetWorkResult of
0: Begin
C2:= 2;
TM2:= BuildTimer (3000,0, TIME_PERIODIC);
End;
1:TM3:= BuildTimer (1000,0, TIME_ONESHOT);
End;
If C1 > 0 Then
Begin
DestroyTimer(TM1);
TM1:= BuildTimer (10000,10, TIME_PERIODIC);
End;
End Else
If uTimerID = TM2 Then // сработал второй таймер
Begin
If GetTM2 = 0 Then
TM3:= BuildTimer (1000,0, TIME_ONESHOT);
C2:= C2 - 1;
If C2 = 0 Then DestroyTimer(TM2);
End Else Work_TM3; // сработал третий таймер
End;
Так как внутри функции вызова TimeProc не должны вызываться системные функции timeSetEvent и timeKillEvent, для создания таймеров использована функция BuildTimer, а для удаления таймеров - функция DestroyTimer.
В результате код программы, соответствующий поставленной задаче будет выглядеть следующим образом:
Var
// описание идентификаторов таймеров
TM1: UINT;
TM2: UINT;
TM3: UINT;
// описание счётчиков количества срабатываний таймеров
C1, C2: Integer;
Function GetWorkResult: Integer;
Begin
Result:= Random(2);
End;
Procedure Work_TM3;
Var
I: Integer;
Begin
I:= 30000;
While I <> 0 do I:= I - 1;
End;
Function GetTM2: Integer;
Begin
Result:= Random(3);
End;
Procedure DestroyTimer (Var T_ID: UINT);
Begin
TimeKillEvent (T_ID);
T_ID:= 0;
End;
Function BuildTimer (uDelay: UINT; uResolution:UINT; fuEvent: UINT): UINT;
Begin
Result:= TimeSetEvent (uDelay, uResolution,@TimeProc, 0, fuEvent);
End;
Procedure TimeProc (uTimerID, uMessage:UINT; dwUser, dw1, dw2:DWORD) stdcall;
Begin
If uTimerID = TM1 Then // сработал первый таймер
Begin
Case GetWorkResult of
0: Begin
C2:= 2;
TM2:= BuildTimer (3000,0, TIME_PERIODIC);
End;
1:TM3:= BuildTimer (1000,0, TIME_ONESHOT);
End;
C1:= C1 - 1;
If C1 = 0 Then DestroyTimer(TM1) Else
Begin
DestroyTimer(TM1);
TM1:= BuildTimer (10000,10, TIME_PERIODIC);
End;
End Else
If uTimerID = TM2 Then // сработал второй таймер
Begin
If GetTM2 = 0 Then
TM3:= BuildTimer (1000,0, TIME_ONESHOT);
C2:= C2 - 1;
If C2 = 0 Then DestroyTimer(TM2);
End Else Work_TM3; // сработал третий таймер
End;
// начало основной программы
Begin
Randomize;
C1:= 5;
TM1:= timeSetEvent (10000, 10, @TimeProc, 0, TIME_PERIODIC);
// здесь подразумевается создание окон приложения
End.
3.3 Программа шаблон
Программа-шаблон содержит:
1) описание идентификаторов-констант таймеров. Для каждого таймера должен быть определён уникальный идентификатор (например, ctm1 или ctm2) и его целочисленное значение (например, ctm1 = 50; ctm2 = 60).
2) описание типа окна, на котором отображается временная диаграмма работы;
3) заголовки сервисных и вызываемых функций. В их число входит процедура DrawDiagram, предназначенная для отображения работы на временной диаграмме. Формат процедуры DrawDiagram:
Procedure DrawDiagram (Resolution: UINT; Proc_count: UINT; Label_value: String; Color_value: TColor);
где Resolution - точность таймера; Proc_count - время выполнения вызываемой функции в миллисекундах; Label_value - пояснительный текст; Color_value - цвет столбика, которым будет обозначено событие. Также к сервисным функциям относится функция BuildTimer, процедура DestroyTimer и функция GetSystemTick, а к вызываемым относятся функции Proc_1, Proc_2 и Proc_3.
4) список глобальных переменных разных типов и список переменных идентификаторов таймеров (совпадает с введёнными обозначениями при домашнем составлении процедур и функций);
5) операции по инициализации таймеров с помощью функции TimeSetEvent и в случае необходимости установке начальных значений счётчиков срабатываний таймеров;
6) действия по обработке событий от таймеров;
7) операции по уничтожению таймеров;
8) служебные функции для чтения системного времени (Function GetSystemTick), для инициализации таймера (Function BuildTimer) и для удаления таймера (Procedure DestroyTimer);
9) список вызываемых функций (Function Proc_1, Proc_2, Proc_3). Программа-шаблон ограничена двумя или тремя функциями;
10) процедуру прорисовки временной диаграммы (Procedure DrawDiagram);
11) служебные действия.
В программе-шаблоне обозначены специальные места: для указания переменных, идентифицирующих таймеры; для ввода инициализирующих таймеры действий; для описания действий, которые необходимо произвести после срабатывания таймера; в которых необходимо удалить таймеры при завершении работы программы.
В программе-шаблоне имеется ряд сервисных функций и процедур, которые необходимо использовать при инициализации таймеров, удалении таймеров и обработки событий от таймеров. В их число входит процедура DrawDiagram, использование которой обязательно, так как с помощью неё процесс работы программы отображается на временной диаграмме.
В программе-шаблоне предлагается метод идентификации таймеров внутри процедуры TimeProc по данным пользователя, сообщённым перед этим в одном из аргументов функции TimeSetEvent при инициализации таймера. В этом случае требуется держать для одного таймера уникальный идентификатор-константу и переменный идентификатор. Идентификаторы-константы и их значения задаются пользователем в разделе 1 программы-шаблона. Названия идентификаторам могут даваться любые, но соответствующие следующим правилам: в начале не ставится цифра; внутри не ставятся пробелы или какие либо другие служебные символы; названия идентификаторов не повторяются.
Внутри процедуры TimeProc, при выполнении действий по обработке событий от таймеров, нельзя использовать функции TimeSetEvent, TimeKillEvent и GetTickCount, и поэтому должны быть сделаны их аналоги за пределами процедуры TimeProc. Здесь обязательно использование процедуры DrawDiagram, т. к. процесс работы должен отображаться графически. Первый параметры процедуры DrawDiagram обозначает разрешение таймера. Второй параметр отвечает за длительность выполнения выполняемой функции. Длительность выполнения можно определить с помощью функции системного времени, а именно, запомнить системное время перед вызовом функции, вызвать функцию, а затем от нового системного времени отнять запомненное. Разность и будет выражать время выполнения вызываемой функции. Системное время нужно считывать с помощью аналога функции GetTickCount. В программе-шаблоне аналогичная функция имеет название GetSystemTick. Сохранять системное время и в конечном итоге время выполнения вызываемой функции можно в переменной Proc_count. Эту переменную и нужно будет поставить в качестве второго параметра процедуры DrawDiagram. Третьим параметром процедуры DrawDiagram должен выступать пояснительный текст. Желательно, чтобы он был следующего вида: название таймера + название вызываемой функции +[возвращённое вызываемой функцией значение] + (время выполнения вызываемой функции). Возвращаемое вызываемой функцией значение предлагается хранить в переменной Return_value. Четвёртый параметр процедуры DrawDiagram - это цвет, которым будет прорисовано текущее срабатывание на временной диаграмме. Для хранения значения цвета предлагается использование переменной Color_value. Если таймер на этом срабатывании остановился, то цвет должен быть красным (clRed), а если он продолжает работать, то цвет должен быть зелёным (clGreen). Под словами «идентификация по данным пользователя» понимается то, что нужно прочитать значение входного параметра dwUser процедуры и сравнить его с уникальными идентификаторами-константами, которые были заданы во втором разделе и которые указывались в качестве одного из параметров функции TimeSetEvent т.е. должна быть конструкция следующего типа:
Case dwUser of
ctm1:
begin
…
end;
ctm2:
begin
…
end;
…
end;
Из примера видно, что названия уникальных идентификаторов констант похожи на названия переменных идентификаторов за исключение того, что в начале добавлена буква «c». Это сделано для предотвращения путаницы, но следует ещё раз напомнить, что названия и тем и другим можно давать любые, руководствуясь лишь вышеприведёнными правилами.
Пусть необходимо идентифицировать срабатывание первого таймера, и если это первый таймер, то запустить вызываемую процедуру, а в конце вывести информацию на временную диаграмму. Текст программы пятого раздела в этом случае будет иметь следующий вид:
Case dwUser of
ctm1:
begin
Proc_count:= GetSystemTick; // засекаем системное время
Return_value:= proc_1; // вызываем нужную функцию и сохраняем возвращённое значение
color_value:= clGreen; // ставим зелёный цвет, предполагая, что таймер периодический
Proc_count:= GetSystemTick - Proc_count; // разность и будет временем выполнения функции
DrawDiagram (5, // точность таймера 5 миллисекунд
proc_count, // сообщаем время выполнения
'tm1 pr1 ['+IntToStr (Return_value)+ // название таймера + название функции +
// возвращённое значение
'] ('+IntToStr (proc_count)+')', // добавляем время выполнения
color_value); // цвет события
end;
…
end;
Случай, когда нужно среагировать на возвращённое вызываемой функцией значение приводится в примере использования программы-шаблона.
В случае, если в программе администрирования пользователя при формировании программы-шаблона не были выбраны служебные функции, то их текст придётся ввести вручную.
Это нужно будет сделать обязательно, так как внутри процедуры TimeProc использовать их скорее всего придётся. К служебным функциям относятся: функция чтения системного времени; функция создания таймера; функция удаления таймера.
Пользователь с помощью программы администрирования Admin.exe выбирает список вызываемых функций (согласно варианта индивидуального задания) и служебные функции по работе с таймерами (BuildTimer, DestroyTimer, GetSystemTick), а также службу таймеров (служба мультимедийных таймеров, служба обычных таймеров).
Непосредственно в саму программу шаблон пользователь вводит: уникальные идентификаторы-константы таймеров, переменные идентификаторы таймеров, действия по инициализации таймеров и начальные значения счётчиков срабатывания таймеров, действия по обработке событий от таймеров и действия по уничтожению таймеров.
Далее приводится текст основного модуля программы-шаблона, предназначенный для решения задачи №1 из раздела 3.2.
unit Mult;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
TeEngine, Series, ExtCtrls, TeeProcs, Chart;
// 1) список уникальных идентификаторов-констант таймеров
// введите слово const
const
// введите список уникальных идентификаторов-констант таймеров
ctm1 = 100;
ctm2 = 200;
// 2) описание типа окна на котором отображается временная диаграмма работы
type
TCHECK_F = class(TForm)
Chart1: TChart;
Series1: TAreaSeries;
procedure FormCreate (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure Series1GetMarkText (Sender: TChartSeries; ValueIndex: Integer;
var MarkText: String);
private
{Private declarations}
public
{Public declarations}
end;
// 3) заголовки сервисных и вызываемых функций
procedure TimeProc (uTimerID, uMessage:UINT; dwUser, dw1, dw2:DWORD); stdcall;
procedure DestroyTimer (var TIMER_ID: UINT); // удалить таймер
Function BuildTimer (uDelay: UINT; // интервал срабатывания
uResolution: UINT; // точность
dwUser: UINT; // данные пользователя
fuEvent: UINT // тип таймера
): UINT; // функция возвращает идентификатор таймера
function Proc_1:integer; // вызываемая функция №1
function Proc_2:integer; // вызываемая функция №2
function Proc_3:integer; // вызываемая функция №3
Function GetSystemTick: Cardinal;
procedure DrawDiagram ( // прорисовка диаграммы
resolution: UINT; // точность срабатывания (разрешение)
proc_count: UINT; // продолжительность выполнения процедуры
label_value: string; // пояснительный текст
Color_value: TColor // цвет (clGreen - зелёный, clRed - красный,…)
);
// 4) список глобальных переменных и идентификаторов-переменных таймеров
var
CHECK_F: TCHECK_F;
AllTime: Cardinal;
ZeroTime: Cardinal;
// введите список идентификаторов-переменных таймеров
tm1: uint;
tm2: uint;
implementation
{$R *.DFM}
uses MMSystem;
procedure TCHECK_F. FormCreate (Sender: TObject);
begin
Randomize;
ZeroTime:= GetTickCount;
// 5) действия по инициализации таймеров и возможной установке счётчиков срабатываний таймеров
// введите действия по инициализации таймеров
TM1:= timeSetEvent (5000,5,@TimeProc, ctm1, TIME_PERIODIC);
// введите начальные значения счётчиков срабатываний таймеров
end;
// 6) действия по обработке событий от таймеров
procedure TimeProc (uTimerID, uMessage:UINT; dwUser, dw1, dw2:DWORD); stdcall;
var
Proc_count: LongWord;
Return_value: integer;
color_value: TColor;
Begin
// введите действия для обработки событий от таймеров
Case dwUser of
ctm1:
begin
Proc_count:= GetSystemTick;
Return_value:= proc_1;
color_value:= clGreen;
Case Return_value of
0:TM2:= BuildTimer (1000,1, ctm2, TIME_ONESHOT);
1:begin
DestroyTimer(TM1);
color_value:= clRed;
end;
End;
Proc_count:= GetSystemTick - Proc_count;
DrawDiagram (5, proc_count, 'tm1 pr1 ['+IntToStr (Return_value)+
'] ('+IntToStr (proc_count)+')', color_value);
end;
ctm2:
begin
Proc_count:= GetSystemTick;
Return_value:= proc_2;
Proc_count:= GetSystemTick - Proc_count;
color_value:= clRed;
DrawDiagram (1, proc_count, 'tm2 pr2 ['+IntToStr (Return_value)+
'] ('+IntToStr (proc_count)+')', color_value);
end;
end;
End;
procedure TCHECK_F. FormDestroy (Sender: TObject);
begin
// 7) операции по уничтожению таймеров
DestroyTimer(TM1);
DestroyTimer(TM2);
end;
// 8) служебные функции
// [6]
Function BuildTimer (uDelay: UINT; uResolution:UINT; dwUser: UINT; fuEvent: UINT): UINT;
Begin
Result:= TimeSetEvent (uDelay, uResolution,@TimeProc, dwUser, fuEvent);
End;
// [7]
procedure DestroyTimer (var TIMER_ID: UINT);
begin
TimeKillEvent (TIMER_ID);
TIMER_ID:= 0;
end;
// [8]
Function GetSystemTick: Cardinal;
begin
result:= GetTickCount;
end;
// 9) вызываемые функции
function Proc_1;
var
I, J: Cardinal;
begin
I:= 1 + Random(30);
J:= GetTickCount;
While GetTickCount - J < I do;
result:= random (5);
end;
function Proc_2;
var
I, J: Cardinal;
begin
I:= 1 + Random(40);
J:= GetTickCount;
While GetTickCount - J < I do;
result:= random (5);
end;
function Proc_3;
var
I, J: Cardinal;
begin
I:= 1 + Random(50);
J:= GetTickCount;
While GetTickCount - J < I do;
result:= random (5);
end;
// 10) процедура прорисовки временной диаграммы
procedure DrawDiagram (
resolution: UINT; // точность срабатывания (разрешение)
proc_count: UINT; // продолжительность выполнения процедуры
label_value: string; // пояснительный текст
Color_value: TColor // цвет (clGreen - зелёный, clRed - красный,…)
);
begin
AllTime:= GetTickCount - ZeroTime;
CHECK_F. Series1. AddXY (AllTime-resolution, 0,'', clWhite);
CHECK_F. Series1. AddXY (AllTime-resolution, proc_count, label_value, Color_value);
CHECK_F. Series1. AddXY (AllTime+resolution, proc_count, '', color_value);
CHECK_F. Series1. AddXY (AllTime+resolution, 0,'', color_value);
end;
// 11) служебные действия
procedure TCHECK_F. Series1GetMarkText (Sender: TChartSeries;
ValueIndex: Integer; var MarkText: String);
begin
if ValueIndex mod 4 <> 1 then MarkText:= «;
end;
end.
таймер служба windows задача
4. Обычные таймеры
4.1 Общие положения
Служба обычных таймеров не такая точная, как служба мультимедийных таймеров, так как она посылает к окнам Microsoft Windows сообщение WM_TIMER. Это сообщение посылается каждый раз после истечения указанного интервала времени задержки для данного таймера. Так как точность таймера зависит от тактовой частоты системы и от частоты чтения приложением сообщений из очереди сообщений, то значение времени задержки только приблизительно.
Приложение, использующее службу обычных таймеров, должно создавать таймер с помощью функции SetTimer.
Каждый таймер имеет уникальный идентификатор. При создании таймера приложение может использовать своё уникальное значение.
Формат функции SetTimer:
Function SetTimer (handle: HWND; nIDEvent: UINT; uElapse: UINT; lpTimerFunc: TFNTimerProc): UINT,
где handle - идентифицирует окно, которое будет связано с таймером; nIDEvent - определяет идентификатор таймера отличный от нуля; nElapse - задержка времени в миллисекундах; lpTimerFunc - не используется.
Возвращаемое значение в случае успеха - целое число, идентифицирующее новый таймер, а если функция потерпела неудачу, то возвращаемое значение нулевое.
Параметр handle является идентификатором окна, принадлежащим инициализирующему таймер приложению. Если этот параметр нулевой, то никакое окно не будет связано с таймером, и параметр nIDEvent игнорируется
Всякий раз, когда значение времени задержки для таймера протекает, система посылает сообщение WM_TIMER к окну (handle), связанному с таймером. Если идентификатор окна не был указан в параметрах SetTimer, то приложение, которое создавало таймер, должно само контролировать приход сообщения WM_TIMER и обрабатывать его.
Формат сообщения WM_TIMER:
WM_TIMER
wTimerID - wParam; tmprc - lParam,
где wTimerID - определяет идентификатор таймера; tmprc - указатель на функцию вызова (не используется).
Это сообщение считывается системной функцией DispatchMessage только тогда, когда никакие другие сообщения не находятся в очереди сообщений.
Новый таймер начинает отсчитывать указанный интервал времени, как только он создан. Приложение может изменить значение времени задержки, используя функцию SetTimer, и может удалить таймер, используя функцию KillTimer. Чтобы использовать ресурсы системы эффективно, приложение должно удалить таймеры, которые больше ему не нужны, для чего используется функция KillTimer.
Формат функции KillTimer:
Function KillTimer (handle: HWND; nIDEvent: UINT): Boolean,
где handle - идентификатор окна, связанного с указанным таймером; nIDEvent - определяет таймер, подлежащий удалению.
В случае успеха возвращаемое значение «истина», иначе возвращаемое значение «ложь».
Значение параметра handle должно быть тем же самым, что и значение, которое было послано в параметре handle к функции SetTimer, создававшей в свою очередь таймер.
Если идентификатор окна (handle), указанный в параметрах функции SetTimer, был не нулевым, то параметр nIDEvent функции KillTimer должен быть таким же, что и посланный к SetTimer параметр nIDEvent. Если приложение вызвало функцию SetTimer с нулевым значение параметра handle, то параметр nIDEvent функции KillTimer должен быть равен значению, возвращенному функцией SetTimer.
Функция KillTimer не удаляет сообщения WM_TIMER уже помещённые в очередь сообщений.
4.2 Пример использования для Delphi 5
Разберём задачу на применение службы обычных таймеров, решение которой ранее приводилось для службы мультимедийных таймеров.
Условие задачи: Необходимо создать периодичный таймер TM1 с интервалом срабатывания 5 секунд, который запускает функцию GetWorkResult и в зависимости от возвращённого этой функции значения программа выполняет следующие действия:
если функция GetWorkResult вернёт 0, то запускается одиночный таймер TM2 с интервалом срабатывания 1 секунда, который в свою очередь будет вызывать процедуру Work_TM2;
если функция GetWorkResult вернёт 1, то таймер TM1 выключается;
если возвращаемое значение отличается от 0 или 1, то никаких действий не производиться.
Пусть функция GetWorkResult будет возвращать одно из пяти значений: 0, 1, 2, 3, 4. Тогда работу функции GetWorkResult реализуем с помощью обращения к счётчику равномерно распределённых случайных чисел:
Function GetWorkResult: Integer;
Begin
Result:= Random(5);
End;
В результате выполнения функции GetWorkResult возвращаемое значение (Result) будет равно 0,1,2,3 или 4.
Пусть процедура Work_TM2 выполняет следующие действия:
Procedure Work_TM2;
Var
I: Integer;
Begin
I:= 30000;
While I <> 0 do I:= I - 1;
End;
Поскольку сначала должен быть запущен таймер TM1, для его установки будем использовать функцию SetTimer:
SetTimer (SimpleWindow. Handle, tm1, 5000, nil);
Это действие будет выполнятся в момент создания окна, т.е. внутри процедуры:
procedure TSimpleWindow. FormCreate (Sender: TObject);
При завершении работы приложения, т.е. в момент уничтожения его основного окна, следует удалить используемые таймеры, для чего используется следующая процедура:
procedure TSimpleWindow. FormDestroy (Sender: TObject);
begin
KillTimer (SimpleWindow. Handle, tm1);
KillTimer (SimpleWindow. Handle, tm2);
end;
Обозначим процедуру GetTimerMes в качестве перехватчика сообщения WM_TIMER:
procedure GetTimerMes (var Msg: TWMTimer); message WM_TIMER;
Описание структуры TWMTimer приводится в приложении 1.
Действия внутри перехватчика сообщения будут выглядеть следующим образом:
Procedure TSimpleWindow. GetTimerMes (var Msg: TWMTimer);
Begin
Case Msg. TimerID of
tm1: Begin // обработка срабатывания первого таймера
Case GetWorkResult of
0: SetTimer (SimpleWindow. Handle, tm2, 1000, nil);
1: KillTimer (SimpleWindow. Handle, tm1);
End;
Msg. Result:= 0; // возвращаем 0, т. к. удачно обработали
End;
tm2: Begin // обработка срабатывания второго таймера
Work_TM2;
KillTimer (SimpleWindow. Handle, tm2);
Msg. Result:= 0; // возвращаем 0, т. к. удачно обработали
End;
End;
End;
Так как служба обычных таймеров должна быть привязана к окну, то необходимо описать тип данных, к которому будет принадлежать окно.
В результате текст основного модуля программы, соответствующий поставленной задаче будет выглядеть следующим образом:
unit Simple;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
const
// описание уникальных идентификаторов таймеров
tm1 = 500;
tm2 = 600;
// описание типа данных, к которому будет принадлежать окно
type
TSimpleWindow = class(TForm)
procedure FormCreate (Sender: TObject); // создание окна
procedure FormDestroy (Sender: TObject); // уничтожение окна
protected
procedure GetTimerMes (var Msg: TWMTimer); message WM_TIMER;
end;
var
SimpleWindow: TSimpleWindow; // окно
implementation
{$R *.DFM}
Function GetWorkResult: Integer;
Begin
Result:= Random(5);
End;
Procedure Work_TM2;
Var
I: Integer;
Begin
I:= Random(3000000);
While I <> 0 Do Dec(I);
End;
Procedure TSimpleWindow. GetTimerMes (var Msg: TWMTimer);
Begin
Case Msg. TimerID of
tm1: Begin // обработка срабатывания первого таймера
Case GetWorkResult of
0: SetTimer (SimpleWindow. Handle, tm2, 1000, nil);
1: KillTimer (SimpleWindow. Handle, tm1);
End;
Msg. Result:= 0; // возвращаем 0, т. к. удачно обработали
End;
tm2: Begin // обработка срабатывания второго таймера
Work_TM2;
KillTimer (SimpleWindow. Handle, tm2);
Msg. Result:= 0; // возвращаем 0, т. к. удачно обработали
End;
End;
End;
procedure TSimpleWindow. FormCreate (Sender: TObject);
begin
Randomize;
SetTimer (SimpleWindow. Handle, tm1, 5000, nil);
end;
procedure TSimpleWindow. FormDestroy (Sender: TObject);
begin
KillTimer (SimpleWindow. Handle, tm1);
KillTimer (SimpleWindow. Handle, tm2);
end;
end.
Текст DPR и DFM файлов приводится в приложении 3.
4.3 Программа шаблон
Программа-шаблон содержит:
1) описание идентификаторов-констант таймеров. Для каждого таймера должен быть определён уникальный идентификатор (например, ctm1 или ctm2) и его целочисленное значение (например, ctm1 = 50; ctm2 = 60).
2) описание типа окна, на котором отображается временная диаграмма работы;
3) заголовки сервисных и вызываемых функций. В их число входит процедура DrawDiagram, предназначенная для отображения работы на временной диаграмме. Формат процедуры DrawDiagram:
Procedure DrawDiagram (Proc_count: UINT; Label_value: String; Color_value: TColor);
где Proc_count - время выполнения вызываемой функции в миллисекундах; Label_value - пояснительный текст; Color_value - цвет столбика, которым будет обозначено событие. Так же здесь имеется заголовок процедуры GetTimerMes, которая является процедурой-перехватчиком сообщения WM_TIMER. К вызываемым относятся функции Proc_1, Proc_2 и Proc_3.
4) список глобальных переменных разных типов;
5) процедуру, запускаемую системой в момент создания окна и вложенные операции по инициализации таймеров с помощью функции SetTimer и в случае необходимости установке начальных значений счётчиков срабатываний таймеров;
6) действия по обработке событий от таймеров;
7) операции по уничтожению таймеров;
8) список вызываемых функций (Proc_1, Proc_2, Proc_3). Программа-шаблон ограничена двумя или тремя функциями;
9) процедуру прорисовки временной диаграммы (DrawDiagram);
10) служебные действия.
В программе-шаблоне обозначены специальные места: для указания уникальных констант, идентифицирующих таймеры; для ввода инициализирующих таймеры действий; для описания действий, которые необходимо произвести после срабатывания таймера; в которых необходимо удалить таймеры при завершении работы программы.
В программе-шаблоне уже произведён перехват сообщения WM_TIMER и остаётся только обрабатывать события от таймеров. Как и в предыдущей программе-шаблоне в этой имеется специальная процедура, отображающая ход работы программы. Она называется DrawDiagram и её использование обязательно. Эта процедура отличается от ранее описанной тем, что при её запуске не надо указывать точность, так как служба обычных таймеров при создании таймеров не оперирует понятием точности.
В программе-шаблоне идентификация таймеров внутри процедуры-перехватчика сообщения WM_TIMER производится с помощью уникальных идентификаторов-констант. В этом случае требуется держать для одного таймера уникальный идентификатор-константу. Название уникального идентификатора-константы и его значение задаются пользователем.
Действия, которые нужно выполнить, когда сработает один из таймеров, следует вводить внутри процедуры-перехватчика сообщения WM_TIMER. Здесь обязательно использование процедуры DrawDiagram, т. к. процесс работы должен отображаться графически. Первый параметр отвечает за длительность работы выполняемой функции. Длительность выполнения можно определить с помощью функции системного времени, а именно запомнить системное время перед вызовом функции, вызвать функцию, а затем от нового системного времени отнять запомненное. Разность и будет выражать время выполнения вызываемой функции. Системное время нужно считывать с помощью функции GetTickCount. Сохранять системное время и в конечном итоге время выполнения вызываемой функции можно в переменной Proc_count. Эту переменную и нужно будет поставить в качестве первого параметра процедуры DrawDiagram. Вторым параметром процедуры DrawDiagram должен выступать пояснительный текст. Желательно, чтобы он был следующего вида: название таймера + название вызываемой функции +[возвращённое вызываемой функцией значение] + (время выполнения вызываемой функции). Возвращаемое вызываемой функцией значение предлагается хранить в переменной Return_value. Третий параметр процедуры DrawDiagram - это цвет, которым будет прорисовано текущее срабатывание на временной диаграмме. Для хранения значения цвета предлагается использование переменной Color_value. Если таймер на этом срабатывании остановился, то цвет должен быть красным (clRed), а если он продолжает работать, то цвет должен быть зелёным (clGreen). Из структуры TWMTimer видно, что её поле TimerID содержит уникальный идентификатор-константу таймера, который послал сообщение, и поэтому нужно прочитать значение Msg. TimerID и сравнить его с уникальными идентификаторами-константами, которые были заданы пользователем и которые указывались в качестве одного из параметров процедуры SetTimer, т.е. должна быть конструкция следующего типа:
Case Msg. TimerID of
tm1:
begin
…
end;
tm2:
begin
…
end;
…
end;
Msg. Result:= 0;
В последней строке примера системе сообщается, что сообщение от таймера обработано, и его можно удалить из очереди сообщений. Следовательно подобная запись должна присутствовать всегда, и поэтому она уже есть в пустой программе-шаблоне.
Пусть необходимо идентифицировать срабатывание первого таймера, и если это первый таймер, то запустить вызываемую процедуру, а в конце вывести информацию на временную диаграмму. Текст процедуры-перехватчика сообщения WM_TIMER будет иметь следующий вид:
Case Msg. TimerID of
tm1: Begin
Proc_count:= GetTickCount; // засекаем системное время
Return_value:= Proc_1; // выполняем вызываемую функцию
Proc_count:= GetTickCount - Proc_count; // разность есть время выполнения
color_value:= clGreen; // таймер продолжает работать, и поэтому цвет зелёный
DrawDiagram (proc_count, 'tm1 pr1 ['+IntToStr (Return_value)+
'] ('+IntToStr (proc_count)+')', color_value); // прорисовка диаграммы
End;
…
end;
Случай, когда нужно среагировать на возвращённое вызываемой функцией значение приводится в рассматриваемом примере использования программы-шаблона.
Текст программы-шаблона приведён в приложении 4.
Пользователь с помощью программы администрирования Admin.exe выбирает список вызываемых функций (согласно варианта индивидуального задания) и службу таймеров (служба мультимедийных таймеров, служба обычных таймеров).
Непосредственно в саму программу-шаблон пользователь вводит: уникальные идентификаторы-константы таймеров, действия по инициализации таймеров и начальные значения счётчиков срабатывания таймеров, действия по обработке событий от таймеров и действия по уничтожению таймеров.
Далее приводится текст основного модуля программы-шаблона, предназначенный для решения задачи №1 из раздела 3.2.
unit Simple;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
TeEngine, Series, ExtCtrls, TeeProcs, Chart;
// 1) список уникальных идентификаторов-констант таймеров
// введите слово const
const
// введите список уникальных идентификаторов-констант таймеров
ctm1 = 500;
ctm2 = 600;
// 2) описание типа окна на котором отображается временная диаграмма работы
type
TSimpleWindow = class(TForm)
Chart1: TChart;
Series1: TAreaSeries;
procedure FormCreate (Sender: TObject); // создание окна
procedure FormDestroy (Sender: TObject);
procedure Series1GetMarkText (Sender: TChartSeries; ValueIndex: Integer;
var MarkText: String); // уничтожение окна
public
// 3) заголовки сервисных и вызываемых функций
procedure DrawDiagram (
proc_count: UINT; // продолжительность выполнения процедуры
label_value: string; // пояснительный текст
Color_value: TColor // цвет (clGreen - зелёный, clRed - красный,…)
);
function Proc_1: Integer;
function Proc_2: Integer;
function Proc_3: Integer;
protected
procedure GetTimerMes (var Msg: TWMTimer); message WM_TIMER;
end;
// 4) список глобальных переменных
var
SimpleWindow: TSimpleWindow; // окно
AllTime: Cardinal;
ZeroTime: Cardinal;
implementation
{$R *.DFM}
// 5) действия по инициализации таймеров и возможной установке счётчиков срабатываний таймеров
procedure TSimpleWindow. FormCreate (Sender: TObject);
begin
Randomize;
ZeroTime:= GetTickCount;
// введите действия по инициализации таймеров
SetTimer (SimpleWindow. Handle, ctm1, 5000, nil);
// введите начальные значения счётчиков срабатываний таймеров
end;
// 6) действия по обработке событий от таймеров
Procedure TSimpleWindow. GetTimerMes (var Msg: TWMTimer);
var
Proc_count: LongWord; // время выполнения служебной процедуры
Return_value: integer; // возвращённое служебной процедурой значение
color_value: TColor; // назначеный для события цвет
Begin
// введите действия для обработки событий от таймеров
Case Msg. TimerID of
ctm1: Begin
Proc_count:= GetTickCount;
Return_value:= Proc_1;
Proc_count:= GetTickCount - Proc_count;
color_value:= clGreen;
Case Return_value of
0: Begin
SetTimer (SimpleWindow. Handle, ctm2, 1000, nil);
End;
1: Begin
KillTimer (SimpleWindow. Handle, ctm1);
color_value:= clRed;
End;
End;
DrawDiagram (proc_count, 'ctm1 pr1 ['+IntToStr (Return_value)+
'] ('+IntToStr (proc_count)+')', color_value);
End;
ctm2: Begin
KillTimer (SimpleWindow. Handle, ctm2);
Proc_count:= GetTickCount;
Return_value:= Proc_2;
Proc_count:= GetTickCount - Proc_count;
color_value:= clRed;
DrawDiagram (proc_count, 'ctm2 pr1 ['+IntToStr (Return_value)+
'] ('+IntToStr (proc_count)+')', color_value);
End;
End;
Msg. Result:= 0; // возвращаем 0 (подразумевается что обработали удачно)
End;
procedure TSimpleWindow. FormDestroy (Sender: TObject);
begin
// 7) операции по уничтожению таймеров
KillTimer (SimpleWindow. Handle, ctm1);
KillTimer (SimpleWindow. Handle, ctm2);
end;
// 8) вызываемые функции
function TSimpleWindow. Proc_1;
var
I, J: Cardinal;
begin
I:= 1 + Random(30);
J:= GetTickCount;
While GetTickCount - J < I do;
result:= random (5);
end;
function TSimpleWindow. Proc_2;
var
I, J: Cardinal;
begin
I:= 1 + Random(40);
J:= GetTickCount;
While GetTickCount - J < I do;
result:= random (5);
end;
function TSimpleWindow. Proc_3;
var
I, J: Cardinal;
begin
I:= 1 + Random(50);
J:= GetTickCount;
While GetTickCount - J < I do;
result:= random (5);
end;
// 9) процедура прорисовки временной диаграммы
procedure TSimpleWindow. DrawDiagram (
proc_count: UINT; // продолжительность выполнения процедуры
label_value: string; // пояснительный текст
Color_value: TColor // цвет (clGreen - зелёный, clRed - красный,…)
);
begin
AllTime:= GetTickCount - ZeroTime;
Series1. AddXY (AllTime - 5,0,'', clWhite);
Series1. AddXY (AllTime-5, proc_count, label_value, Color_value);
end;
procedure TSimpleWindow. Series1GetMarkText (Sender: TChartSeries;
ValueIndex: Integer; var MarkText: String);
begin
if ValueIndex mod 4 <> 1 then MarkText:= «;
end
Размещено на Allbest.ru
Подобные документы
Delphi как среда разработки программ, ориентированных на работу в Windows. Назначение и преимущество использования электронных учебников. Описание возможностей среды Delphi 5 для разработки электронного учебника. Варианты применения служб Internet.
дипломная работа [3,6 M], добавлен 13.07.2011Теоретические сведения о таймерах Windows. Описание используемых WinAPI функций для измерения текущего времени, для создания виртуальных таймеров. Выключение и перезагрузка компьютера по нажатию на кнопку и по таймеру, вывод текущей даты и времени.
курсовая работа [50,0 K], добавлен 18.05.2014Разработка 32-разрядных приложений Windows с помощью системы виртуального объектно-ориентированного программирования Delphi. Работа с коммуникационными портами. Виртуальное проектирование Windows. Назначение контактов COM порта (разъём DB-9S.).
реферат [32,7 K], добавлен 28.08.2009История создания. Windows 9x/NT. Операционная система Microsoft Windows. Преимущества и недостатки Windows. Некоторые клавиатурные комбинации Windows 9x и NT. Windows XP Professional. Наиболее совершенная защита.
реферат [19,3 K], добавлен 18.07.2004Описание преимуществ использования серверной системы Windows Server 2003. Усовершенствования служб Active Directory и приложений. Новшества технологий кластеризации, файловых и корпоративных служб, работы в сети и связи, в управлении хранилищами.
реферат [108,2 K], добавлен 25.11.2010Управление службами SQL Server 2000. Настройка данного приложения. Использование SQL Server Enterprise Manager для запуска и остановки служб. Применение инструментов Windows. Учетные записи служб SQL Server 2000, консоль, интерфейс и утилиты Osql.
презентация [200,9 K], добавлен 10.11.2013Управление задачами и процессами, запускаемыми под управлением Microsoft Windows. Учетные записи пользователей Windows. Установка оборудования и программного обеспечения. Изменение параметров и удаление учетной записи. Проверка дисков на наличие ошибок.
реферат [2,7 M], добавлен 23.05.2012Теоретические сведения о возможностях Microsoft.NET. Разработка Windows-приложения на платформе Microst.NET: функциональное назначение, описание логической структуры, изучение требований по установке и техническому обеспечению программного продукта.
курсовая работа [3,8 M], добавлен 28.06.2011Появление и развитие Microsoft. Крупнейшая в мире компания-разработчик компьютерного программного обеспечения. Появление Windows и Интернета. Выход Windows XP с обновленным дизайном. Разработка интеллектуальных функций для обеспечения безопасности.
реферат [32,7 K], добавлен 19.11.2013Операционная система Windows NT, её особенности. Windows 95 как первая полноценная графическая операционная система корпорации Microsoft. Основные преимущества Windows XP перед другими системами. Варианты Windows Vista для различных сегментов рынка.
реферат [26,9 K], добавлен 12.07.2011