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

 // "Для вас выполнено " +

 // 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"

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

Перейти на страницу:

Похожие книги

Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

Эндрю Хант , Дэвид Томас , А. Алексашин

Программирование / Книги по IT
Разработка ядра Linux
Разработка ядра Linux

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.

Роберт Лав

Программирование, программы, базы данных / Программирование / Книги по IT