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

ЖАНРЫ

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

Салмре Иво

Шрифт:

 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 +

 // " расчетов!");

}

Листинг 9.5. Код класса FindNextPrimeNumber.cs

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) {

Поделиться с друзьями: