Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework
- Название:Программирование мобильных устройств на платформе .NET Compact Framework
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2006
- Город:Москва • Санкт-Петербург • Киев
- ISBN:5-8459-0989-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework краткое содержание
Книга известного профессионала в области компьютерных технологий посвящена разработке приложений для широкого спектра мобильных устройств с использованием популярной и постоянно развивающейся платформы .NET Compact Framework. Уникальность этой книги состоит в том, что в ней гармонично переплетены теоретические сведения обо всем цикле разработки программного обеспечения с практическими примерами применения на языках С# и Visual Basic. Подробно рассматриваются концепции, лежащие в основе самой платформы .NET Compact Framework, а также вопросы, связанные с созданием эффективного пользовательского интерфейса, управлением памятью, производительностью и надежностью. Немалое внимание уделяется практическим аспектам разработки приложений для мобильных устройств, среди которых выбор модели представления и доступа к данным, внедрение коммуникационной модели, реализация модели поведения с помощью конечных автоматов и использование XML.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Программирование мобильных устройств на платформе .NET Compact Framework - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
//------------------------------------------------------
//Весь этот код должен находиться внутри класса Form1.cs
//------------------------------------------------------
//Объект, который будет выполнять все фоновые вычисления
FindNextPrimeNumber m_findNextPrimeNumber;
//--------------------------------------------
//Обновить текст, информирующий о состоянии...
//--------------------------------------------
void setCalculationStatusText(string text) {
label1.Text = text;
}
//-------------------------------------
//Пункт меню для "выхода" из приложения
//-------------------------------------
private void menuItemExit_Click(object sender, System.EventArgs e) {
this.Close();
}
//----------------------------------------
//Пункт меню для начала фоновых вычислений
//----------------------------------------
private void menuItemStart_Click(object sender, System.EventArgs e) {
//Число, с которого мы хотим начать поиск
long startNumber = System.Convert.ToInt64(textBox1.Text);
//Установить фоновое выполнение
m_findNextPrimeNumber = new FindNextPrimeNumber(startNumber);
//Запустить выполнение задачи в фоновом режиме
m_findNextPrimeNumber.findNextHighestPrime_Async();
//Установить таймер, используемый для контроля длительности вычислений
timer1.Interval = 400;
//400 мс timer1.Enabled = true;
}
//--------------------------------------------
//Пункт меню для "отмены" выполняющейся задачи
//--------------------------------------------
private void menuItemAbort_Click(object sender, System.EventArgs e) {
//He делать ничего, если вычисления не выполняются
if (m_findNextPrimeNumber == null) return;
//Установить поток в состояние прекращения выполнения
m_findNextPrimeNumber.setProcessingState(FindNextPrimeNumber.ProcessingState.reguestAbort);
//Немедленно известить пользователя
//o готовности прекратить выполнение...
setCalculationStatusText("Waiting to abort...");
// setCalculationStatusText("Ожидание прекращения выполнения...");
}
//-------------------------------------------------------------
//Этот таймер, вызываемый потоком пользовательского интерфейса,
//позволяет отслеживать состояние выполнения
//фоновых вычислений
//-------------------------------------------------------------
private void timer1_Tick(object sender, System.EventArgs e) {
//Если к моменту вызова искомое простое число еще
//не было найдено, отключить таймер
if (m_findNextPrimeNumber == null) {
timer1.Enabled =false;
return;
}
//-------------------------------------------------
//Если выполнение было отменено, освободить объект,
//осуществляющий поиск, и выключить таймер
//-------------------------------------------------
if (m_findNextPrimeNumber.getProcessingState ==
FindNextPrimeNumber.ProcessingState.aborted) {
timer1.Enabled = false;
m_findNextPrimeNumber = null;
setCalculationStatusText("Prime search aborted");
// setCalculationStatusText("поиск простого числа отменен");
return;
}
//----------------------------------
//Удалось ли найти правильный ответ?
//----------------------------------
if (m_findNextPrimeNumber.getProcessingState ==
FindNextPrimeNumber.ProcessingState.foundPrime) {
timer1.Enabled = false;
//Отобразить результат
setCalculationStatusText("Found! Next Prime = " + m_findNextPrimeNumber.getPrime().ToString());
// setCalculationStatusText("Чиcлo найдено! Следующее простое число = " +
// m_findNextPrimeNumber.getPrime().ToString());
m_findNextPrimeNumber = null;
return;
}
//--------------------------------------
//Вычисления продолжаются. Информировать
//пользователя о состоянии выполнения
//--------------------------------------
//Получить два выходных значения
long numberCalculationsToFar;
long currentItem;
m_findNextPrimeNumber.getExecutionProgressInfo(out numberCalculationsToFar,out currentItem);
setCalculationStatusText("In progress. Looking at: " +
currentItem.ToString() + ". " +
numberCalculationsToFar.ToString() +
" calculations done for you so far!");
// setCalculationStatusText("Вычисления продолжаются. Поиск в области: " +
// currentItem.ToString() + ". " +
// "Для вас выполнено " +
// numberCalculationsToFar.ToString() +
// " расчетов!");
}
using System;
public class FindNextPrimeNumber {
//Перечисляем возможные состояния
public enum ProcessingState {
notYetStarted,
waitingToStartAsync,
lookingForPrime,
foundPrime,
requestAbort,
aborted
}
long m_startPoint;
long m_NextHighestPrime;
//Поиск какого количества элементов выполнен?
long m_comparisonsSoFar;
//Для какого элемента сейчас выполняется поиск простого числа?
long m_CurrentNumberBeingExamined;
//Вызывается для обновления информации о состоянии выполнения
public void getExecutionProgressInfo(out long numberCalculationsSoFar, out long currentItemBeingLookedAt) {
//ПРИМЕЧАНИЕ. Мы используем блокирование потока для уверенности в том,
//что эти значения не считываются во время выполнения операции
//их записи. Поскольку доступ к m_comparisonsSoFar
//и m_CurrentNumberBeingExamined могут осуществлять
//одновременно несколько потоков, любая выполняемая над ними
//операция записи/считывания должна синхронизироваться с "блокировкой",
//что будет гарантировать "атомарность" этих операций
lock (this) {
numberCalculationsSoFar = m_comparisonsSoFar;
currentItemBeingLookedAt = m_CurrentNumberBeingExamined;
}
}
ProcessingState m_processingState;
//---------------------------
//Простейший конечный автомат
//---------------------------
public void setProcessingState(ProcessingState nextState) {
//------------------------------------------------------
//Простейший защитный код, гарантирующий
//невозможность перехода в другое состояние, если задача
//либо успешно завершена, либо успешно отменена
//------------------------------------------------------
if ((m_processingState == ProcessingState.aborted) ||
(m_processingState == ProcessingState.foundPrime)) {
return;
}
//Разрешить изменение состояния
m_processingState = nextState;
}
public ProcessingState getProcessingState {
get {return m_processingState;}
}
//------------------------
//Возвращает простое число
//------------------------
public long getPrime() {
if (m_processingState != ProcessingState.foundPrime) {
throw new Exception("простое число еще не найдено!");
}
return m_NextHighestPrime;
}
//Конструктор класса
public FindNextPrimeNumber(long startPoint) {
setProcessingState(ProcessingState.notYetStarted);
m_startPoint = startPoint;
}
//-----------------------------------------------------------
//Создает новый рабочий поток, который будет вызывать функцию
// "findNextHighestPrime()"
//-----------------------------------------------------------
public void findNextHighestPrime_Async() {
System.Threading.ThreadStart threadStart;
threadStart = new System.Threading.ThreadStart(findNextHighestPrime);
Интервал:
Закладка: