Чтение онлайн

на главную - закладки

Жанры

Программирование мобильных устройств на платформе .NET Compact Framework

Салмре Иво

Шрифт:

 • Ниже меню Start, которое вы только что добавили (там, где находится текст "Type Here"), введите Abort в качестве текста меню. Используя окно Properties, измените имя элемента меню с menuItem2 на menuItemStart. Примечание: при необходимости обратитесь к рис. 9.2. 

5. Добавьте в проект новый класс. Назовите его FindNextPrimeNumber.сs. Замените содержимое кода класса в окне редактора кодом из листинга 9.5. 

6. Перейдите обратно в окно Form1.cs [Design] и дважды щелкните на элементе меню Exit. В результате этого будет автоматически сгенерирована функция void menuItemExit_Click, а фокус переместится в окно редактора кода. Введите для этой функции код из листинга 9.4. 

7. Перейдите обратно в окно Form1.cs [Design] и дважды щелкните на элементе меню Start. В результате этого будет автоматически сгенерирована функция private void menuItemStart_Click, а фокус переместится в окно редактора кода. Введите для этой функции код из листинга 9.4. 

8. Перейдите обратно в окно Form1.cs [Design] и дважды щелкните на названии меню Abort. В результате этого будет автоматически сгенерирована функция private void menuItemAbort_Click, а фокус переместится в окно редактора кода. Введите для этой функции код из листинга 9.4. 

9. Перейдите обратно в окно Form1.CS [Design] и дважды щелкните на элементе управления timer1 в нижней части окна конструктора. В результате этого будет автоматически сгенерирована функция private void timer1_Tick. Введите для этой функции код из листинга 9.4. 

10. Введите в класс Form1.cs остальную часть кода из листинга 9.4. 

11. Нажмите клавишу <F5> для компиляции кода и развертывания приложения в эмуляторе Smartphone.

Запустив приложение, нажмите сначала кнопку телефона для вызова меню Prime Search, а затем — клавишу <1> для выбора пункта меню Start В результате этого начнется поиск простых чисел. В процессе выполнения поиска элемент управления timer1 будет несколько раз в секунду вырабатывать событие таймера, заставляющее пользовательский интерфейс обновлять отображаемый на форме текст с информацией о текущем состоянии. В результате динамического обновления этого текста, происходящего несколько раз в секунду, пользователь получает регулярное подтверждение того, что его запрос обрабатывается. Процесс поиска продолжается до тех пор, пока не будет найдено простое число или пока пользователь не выберет пункт Abort меню Prime Search и не нажмет кнопку <2>. Чтобы увеличить продолжительность поиска, перед тем, как его начать, введите в текстовом поле формы произвольное большое число. На моем эмуляторе поиск для начального числа 12345678901234 длился более 20 секунд. В том виде, как он есть, приведенный ниже код не препятствует запуску нового поиска в то время, когда предыдущий еще не закончился. Будет неплохо, если вы усовершенствуете приложение, введя в него проверку этого условия и прекращая выполнение текущего поиска, если к моменту запуска нового он еще не был закончен. Рекомендуется также, чтобы вы заглянули в код, представленный в листинге 9.5. и посмотрели, как ключевое слово lock используется для того, чтобы исключить параллельное вхождение различных потоков в критический раздел, не являющийся безопасным в отношении многопоточного выполнения.

Листинг 9.4. Код, который должен быть помещен в класс Smartphone Form1.cs

//------------------------------------------------------

//Весь этот код должен находиться внутри класса 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;

 }

 //-------------------------------------------------

Поделиться:
Популярные книги

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

Черный Маг Императора 20

Герда Александр
20. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 20

Л. Пантелеев — Л. Чуковская. Переписка (1929–1987)

Пантелеев Леонид
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Л. Пантелеев — Л. Чуковская. Переписка (1929–1987)

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Справочник логопеда

Коллектив авторов
Научно-образовательная:
медицина
6.25
рейтинг книги
Справочник логопеда

Сирийский рубеж

Дорин Михаил
5. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж