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

ЖАНРЫ

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

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

//ПРИМЕЧАНИЕ. Мы используем блокирование потока для уверенности в том,

//что эти значения не считываются во время выполнения операции

//их записи. Поскольку доступ к 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);

System.Threading.Thread newThread;

newThread = new System.Threading.Thread(threadStart);

//Состояние должно отвечать, что поиск продолжается

setProcessingState(ProcessingState.waitingToStartAsync);

newThread.Start;

}

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

//Основной рабочий поток. Этот поток запускает поиск очередного

//простого числа и выполняется до тех пор, пока не произойдет

//одно из следующих двух событий:

// (а) найдено очередное простое число

// (b) от внешнего (по отношению к данному) потока поступила

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