Российская международная академия туризма
Опубликован: 09.09.2008 | Доступ: свободный | Студентов: 776 / 15 | Оценка: 4.33 / 4.33 | Длительность: 13:07:00
Лекция 16:

Динамическое распределение памяти

< Лекция 15 || Лекция 16: 12 || Лекция 17 >
Аннотация: В лекции описаны основные отличия операционной системы Windows CE от системы Windows NT, а также некоторые особенности Windows CE. Рассмотрены механизмы динамического распределения памяти (выделение, удаление)

Одной из сильных сторон операционной системы для Pocket PC - Windows CE - является то, что в основу ее разработки были положены преимущества версии Windows для настольных ПК. Вы можете заметить сходства между двумя системами, но важно обратить внимание и на различия между реализацией систем Windows CE и Windows NT. Одним из различий является то, что система Windows CE использует значительно облегченные процессы по сравнению с Windows NT, что позволило снизить затраты ресурсов на производительность. В отличие от Windows NT, система Windows CE задумывалась как настраиваемая система. Использование процессов для развертывания API системы позволило регулировать запросы к ПЗУ и ОЗУ в зависимости от того, какая часть ресурсов операционной системы требовалась для определенного устройства. Например, устройство можно настроить на работу только с одним процессом API – системным ядром (nk.exe). Другие устройства, которым требуется поддержка интерфейса пользователя, должны будут запустить процесс интерфейса пользователя (gwes.exe) [ [ 8 ] ].

Тем не менее, для рассматриваемых в книге версий Windows CE (5.0) существует ограничение на число одновременно выполняемых процессов (32), что может не проявляться в условиях эмуляции среды на настольной системе, но приводить к генерации исключения непосредственно на девайсе.

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

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

Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, закрыть
  • Алгоритмы: изменение размеров просмотра рисунка; прокрутка записей вперед и назад списка рисунков; добавление, замена и удаление записей из списка рисунков галереи.
  • Информационно-справочные: О программе

Наращивание функциональности не предусматривается.

Защита данных – нет.

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

Шаг 1. Разработка графического интерфейса

Предусматривается одна форма с TabControl, включающим две закладки – Просмотр и Галерея.


Рис. 15.1.

Рис. 15.2.

Закладка "Просмотр" содержит контейнер для просмотра рисунков PictureBox, текстовое поле для комментария к рисунку, текстовое поля для отображения имени файла рисунка (свойство ReadOnly = True), кнопку "-" для изменения размеров рисунка, кнопку "<" прокрутки просмотра фотогалереи назад, кнопку ">" для просмотра фотогалереи вперед и кнопку "Добавить рисунок" (изначально свойство Visible=False ) для занесения в базу данных пути и имени файла рисунка.

Закладка "Галерея" содержит DataGrid для просмотра XML-файла списка рисунков, поле порядкого номера рисунка в галереи (свойство ReadOnly = True ), кнопку "Заменить" для замены записи в списке рисунков галереи и кнопку "Удалить" для удаления записи из списка.

Из невидимых элементов интерфейса – главное меню с опциями "Файл" и "Добавить рисунок".

Меню "Файл" в свою очередь, содержит опции "Открыть галерею", "Сохранить галерею", "О программе" и "Выход".

Другими невидимыми элементами являются два OpenFileDialog (для девайса рекомендуется свойство InitialDirectory = FlashDisk\image\ ) для открытия файла галерей (свойство Filter = Файлы XML |*.xml ) и для открытия файла рисунка (свойство Filter = Рисунки |*.jpg ), и один SaveFileDialog для записи файла галереи.

Примерный дизайн формы приведен на рис. 15.1 и 15.2.

Шаг 2. Добавляем библиотеки

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;
//добавляем
using System.IO;
using System.Xml;
using System.Runtime.InteropServices; // beep

Шаг 3. Добавляем переменные в public class Form1 : System.Windows.Forms.Form

int my_picture; //номер файла
int my_width=238;//геометрия рисунка
int my_loc=1;// позиционирование рисунка
public string file_test=@"FlashDisk\image\auto_foto.xml";//
public static DataSet dataSetApp;// глобальный датасет
public static DataTable dataTableApp;//глобальный дататейбл
System.Int64 my_Int64;   // переменная номера строки
//переменная для удаления строки, чтобы не нарушать коллекцию foreach
DataRow remove_row;
DataRow newRow;
Int64 my_maxID=0;
string file_name;
Bitmap Circle; // создаем ссылочную переменную рисунка
// Runtime beep (на девайсе может не работать) 
[DllImport("user32.dll")]
public static extern int MessageBeep(uint n);

Шаг 4. Добавляем инициализацию public Form1()

{
InitializeComponent();
// по умолчанию грузим шаблон галереи
dataSetApp=new DataSet();
dataTableApp=dataSetApp.Tables.Add("FotoDrive");
// добавляем столбцы
dataTableApp.Columns.Add("Комментарий",
System.Type.GetType("System.String"));
dataTableApp.Columns.Add("t",System.Type.GetType("System.String"));
dataTableApp.Columns.Add("ID",System.Type.GetType("System.Int64"));
dataTableApp.Columns.Add("File",System.Type.GetType("System.String"));
// пытаемся прочитать файл
FileStream fin;		
try {
fin=new FileStream(file_test,FileMode.Open);
fin.Close();
// Считываем значения из файла
XmlTextReader xml_in=new XmlTextReader(file_test); 
dataSetApp.ReadXml(@xml_in);
xml_in.Close();
	}
catch(IOException exc) {// если файла нет, то создаем
// добавляем первую строку для шаблона
object[] a1={"Самый спортивный Мурзилка","1","1", 
@"FlashDisk\image\1.jpg"};	// массив строки	
dataTableApp.Rows.Add(a1);
this.textBox1.Text="Самый спортивный Мурзилка";
FileStream fin_out;		
fin_out=new FileStream(file_test,FileMode.OpenOrCreate);
fin_out.Close();
StreamWriter xml_out2;
xml_out2=new StreamWriter(file_test);//}
// форматируем xml
XmlTextWriter xmlWriter=new XmlTextWriter(xml_out2);
// способ форматирования
xmlWriter.Formatting=Formatting.Indented;
xmlWriter.Indentation=3; 
// принимаем изменения в dataSet !!!
dataTableApp.AcceptChanges();
// выводим в xml
dataSetApp.WriteXml(xmlWriter,XmlWriteMode.IgnoreSchema);
xmlWriter.Close();
MessageBox.Show("Файл записан под именем \n"+
	@"FlashDisk\image\auto_foto.xml","Сохранение");
}
this.dataGrid1.Visible=true;
this.dataGrid1.TableStyles.Clear();
DataGridTableStyle tsApp= new DataGridTableStyle();
tsApp.MappingName="FotoDrive";
DataGridTextBoxColumn csApp=new DataGridTextBoxColumn();
csApp.Width=200;
csApp.MappingName="Комментарий";
csApp.HeaderText="Комментарий";
tsApp.GridColumnStyles.Add(csApp);
csApp = new DataGridTextBoxColumn();
csApp.Width=10;
csApp.MappingName="t";
csApp.HeaderText="t";
tsApp.GridColumnStyles.Add(csApp);
csApp = new DataGridTextBoxColumn();
csApp.Width=50;
csApp.MappingName="ID";
csApp.HeaderText="ID";
tsApp.GridColumnStyles.Add(csApp);
csApp = new DataGridTextBoxColumn();
csApp.Width=300;
csApp.MappingName="File";
csApp.HeaderText="File";
tsApp.GridColumnStyles.Add(csApp);
this.dataGrid1.TableStyles.Add(tsApp);
DataView sortedView=new DataView(dataTableApp);
sortedView.Sort="ID";//  сортировка	
dataGrid1.DataSource=sortedView;// привязываем
}
< Лекция 15 || Лекция 16: 12 || Лекция 17 >