Шрифт:
//Поиск какого количества элементов выполнен?
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;
}
//-------------------------------------------------------------