Опубликован: 01.10.2013 | Уровень: для всех | Доступ: платный
Лекция 3:

Особенности использования программных инструментальных платформ параллельных вычислительных систем общего назначения

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

Класс служит типом для создания объекта - источника рассылки извещений о событии. Обратите внимание, что при объявлении события " Месяц " имя делегата " Расчет " расширяется именем класса " Человек ", в котором определен этот делегат. Метод " Разослать " будет вызываться источником сообщений (в данном примере это будет метод Main ) и вызывать через событие " Месяц " все делегаты, подписавшиеся на это событие. Генерации события предшествует проверка наличия подписки.

class Program {
static void Main(string[] args) {
Человек   чел = new Человек("Иванов", 100.0, 200.0); 
Предприятие пр1 = new Предприятие(), пр2 = new Предприятие(); 
Банк     бнк = new Банк();
//Создаем объект, который будет выполнять 
//рассылку извещений о событии 
Извещение изв = new Извещение(чел);
//Подписываемся на рассылку
изв.Месяц += new	Человек.Расчет(бнк.Пересчитать);
изв.Месяц += new	Человек.Расчет(пр1.Начислить);
изв.Месяц += new	Человек.Расчет(пр1.Вычесть);
изв.Месяц += new	Человек.Расчет(бнк.Внести);
изв.Месяц += new	Человек.Расчет(пр2.Начислить);
изв.Месяц += new	Человек.Расчет(пр2.Вычесть);
изв.Месяц += new	Человек.Расчет(бнк.Внести);
изв.Месяц += new	Человек.Расчет(бнк.Сообщить);
//Генерируем сообщение - "Конец месяца" 
for(int i=0; i<3; i++) изв.Разослать(); } }

При запуске программы в методе Main создается объект типа " Человек ". Этот объект будет использоваться в качестве аргумента во всех обработчиках.

В качестве объекта - источника для рассылки извещений создается объект c именем изв и три объекта - приемника извещений: два предприятия ( пр1 и пр2 ) и один банк ( бнк ). Объекты производят подписку на события, регистрируя в событии изв.Месяц делегаты типа " Расчет ", которым поручено представлять методы - обработчики событий. Обратите внимание, что имя делегата " Расчет " расширено именем класса "Человек". Необходимость такого расширения вызвана тем, что определение делегата локализовано в классе " Человек ".

Выполнение программы завершается трехкратной генерацией сообщения об окончании месяца, которое реализовано как вызов метода рассылки извещений " изв.Разослать() ".На каждое сообщение об окончании месяца будут разосланы извещения и вызваны обравботчики событий в следующей последовательности:

бнк.Пересчитать(чел);
пр1.Начислить(чел);
пр1.Вычесть(чел);
бнк.Внести(чел);
пр2.Начислить(чел);
пр2.Вычесть(чел);
бнк.Внести(чел);
бнк.Сообщить(чел);

В результате клиент получит три справки о состоянии вклада:

Вклад Иванов: 390,00 
Вклад Иванов: 589,50 
Вклад Иванов: 798,98

По рассмотренной схеме реализуются приложения с графическим интерфейсом пользователя, например, приложения, создаваемые в среде Visual Studio.Net по шаблону Windows Application (рис. 2.6).

Типовая структура Windows-приложения

Рис. 2.6. Типовая структура Windows-приложения

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

Технологически разработка программы в этом случае сводится к следующим процессам:

  1. Автоматическая генерация каркаса программы по заданному разработчиком шаблону.
  2. Конструирование формы пользовательского интерфейса в визуальном режиме, сводящееся к размещению на форме элементов из имеющегося набора и настройка их свойств.
  3. Связывание элементов интерфейса в визуальном режиме с обработчиками событий.
  4. Ручная разработка кода, необходимого для обработки событий.

На рис. 2.7 приведена форма приложения, выполняющего вывод сообщения в окно и очистку этого окна.

Форма приложения и элементы управления

Рис. 2.7. Форма приложения и элементы управления

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

using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Начало
{
 static class Program
 {
  [STAThread]
  static void Main() 
  {
   Application.EnableVisualStyles(); 
   Application.SetCompatibleTextRenderingDefault(false); 
   Application.Run(new Form1();форма); 
  } 
 } 
}

В классе Program определен метод Main, с которого начинается выполнение программы. Статический метод Run класса Application принимает ссылку на объект-приемник и организует цикл опроса очереди сообщений.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Начало
{
 public partial class Form1 : Form 
 {
  //Конструктор формы
  public Form1()
  {
   InitializeComponent();
  }
  //Обработчик щелчка мышью на кнопке Выдать (имя объекта
  //button1)
  private void button1_Click(object sender, EventArgs e)
  {
   textBox1.Text = "Привет";
  }
  //Обработчик щелчка мышью на кнопке Очистить(имя объекта
  //button2)
  private void button2_Click(object sender, EventArgs e)
  {
   textBox1.Text = "";
  }
  //Обработчик щелчка мышью на кнопке Выход(имя объекта
  //button3)
  private void button3_Click(object sender, EventArgs e)
  {
   Close(); 
  } 
 } 
}
using System.Drawing; 
using System.Windows.Forms; 
using System.ComponentModel; 
using System;
namespace Начало 
{
 partial class Form1 
 {
  //Поля - ссылки на объекты
  private Button button1;
  private Button button2;
  private Button button3;
  private TextBox textBox1;
  private IContainer components = null;
  //Освобождение ресурсов при закрытии формы
  //(метод вызывается автоматически при закрытии формы)
  protected override void Dispose(bool disposing)
  {
   if (disposing && (components != null)) 
   {
    components.Dispose(); 
   }
   base.Dispose(disposing); 
  }
  //Инициализация полей формы и самой формы
  private void InitializeComponent()
  {
   //Создание объектов интерфейса
   button1 = new Button();
   button2 = new Button();
   button3 = new Button();
   textBox1 = new TextBox();
   //Запрещение приема извещений о событиях на время установки
   //свойств объектов интерфейса и формы
   SuspendLayout(); 
   //1.Установка свойств объекта button1 (кнопка Выдать)
   //1.1.Расположение элемента на форме (левый верхний угол)
   button1.Location = new Point(12, 57);
   //1.2.Имя объекта
   button1.Name = "button1";
   //1.3.Размер объекта
   button1.Size = new Size(75, 23);
   //1.4.Очередность передачи фокуса управления клавишей
   //табуляции
   button1.TabIndex = 0;
   //1.5.Текст, отображаемый на изображении объекта
   button1.Text = "Выдать";
   //1.6.Режим использования фонового цвета для элемента
   //(использовать фоновый цвет данного элемента)
   button1.UseVisualStyleBackColor = true;
   //1.7.Подписка на событие
   button1.Click += new EventHandler(button1_Click); 
   //2.Установка свойств объекта button2 (кнопка Очистить)
   //2.1.Расположение элемента на форме (левый верхний угол)
   button2.Location = new Point(110, 57);
   //2.2.Имя объекта
   button2.Name = "button2";
   //2.3.Размер объекта
   button2.Size = new Size(75, 23);
   //2.4.Очередность передачи фокуса управления клавишей
   //табуляции
   button2.TabIndex = 1;
   //2.5.Текст, отображаемый на изображении объекта
   button2.Text = "Очистить";
   //2.6.Режим использования фонового цвета для элемента
   //(использовать фоновый цвет данного элемента)
   button2.UseVisualStyleBackColor = true;
   //2.7.Подписка на событие
   button2.Click += new EventHandler(button2_Click); 
   //3.Установка свойств объекта button3 (кнопка Выход)
   //3.1.Расположение элемента на форме (левый верхний угол)
   button3.Location = new Point(205, 57);
   //3.2.Имя объекта
   button3.Name = "button3";
   //3.3.Размер объекта
   button3.Size = new Size(75, 23);
   //3.4.Очередность передачи фокуса управления клавишей
   //табуляции
   button3.TabIndex = 2;
   //3.5.Текст, отображаемый на изображении объекта
   button3.Text = "Выход";
   //3.6.Режим использования фонового цвета для элемента
   //(использовать фоновый цвет данного элемента)
   button3.UseVisualStyleBackColor = true;
   //3.7.Подписка на событие
   button3.Click += new EventHandler(button3_Click); 
   //4.Установка свойств объекта textBox1 (отображение текстового
   //сообщения)
   //4.1.Расположение элемента на форме (левый верхний угол)
   textBox1.Location = new Point(52, 12);
   //4.2.Имя объекта
   textBox1.Name = "textBox1";
   //4.3.Размер объекта
   textBox1.Size = new Size(167, 20);
   //4.4.Очередность передачи фокуса управления клавишей
   //табуляции
   textBox1.TabIndex = 3; 
   //5.Установка свойств объекта Form1
   //5.1.Установка единиц измерения и режима изменения размеров
   //в зависимости от выбранного шрифта
   AutoScaleDimensions = new SizeF(6F, 13F);
   this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
   //5.2.Имя объекта
   Name = "Form1";
   //5.3.Текст, отображаемый на изображении объекта
   Text = "Form1";
   //5.4.Размер клиентской части формы (без учета заголовка)
   ClientSize = new Size(292, 104);
   //5.5.Запоминание ссылок на элементы управления
   //в динамическом массиве Controls
   Controls.Add( textBox1);
   Controls.Add( button3);
   Controls.Add( button2);
   Controls.Add( button1);
   //Разрешение приема извещений о событиях
   ResumeLayout(false); 
   PerformLayout(); 
  } 
 } 
}

Жирным шрифтом выделен код обработчиков событий, который необходимо ввести вручную.

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Евгений Акимов
Евгений Акимов

Добрый день!

 

Скажите, пожалуйста,планируется ли продолжение курсов по нанотехнологиям?

Спасибо,

Евгений

 

Nozimjon Fayziev
Nozimjon Fayziev
Таджикистан, Душанбе
Анна Волкова
Анна Волкова
Россия, г. Новосибирск