Литмир - Электронная Библиотека
Содержание  
A
A

   currentItem = m_startPoint + 2;

  } else {

   //Число является четным, начать поиск со следующего нечетного числа

   currentItem = m_startPoint + 1;

  }

  //Приступить к поиску простого числа

  while(getProcessingState() == ProcessingState.lookingForPrime) {

   //B случае нахождения простого числа возвратить его

   if (isItemPrime(currentItem) == true) {

    m_NextHighestPrime = currentItem; //Обновить состояние

    setProcessingState(ProcessingState.foundPrime);

   }

   currentItem = currentItem + 2;

  }

finished_looking:

  //Выход. К этому моменту либо от другого потока поступила

  //команда прекратить поиск, либо было найдено и записано

  //следующее наибольшее простое число

  //Зафиксировать время

  m_endTickCount = System.Environment.TickCount;

  //Если поступил запрос прекратить выполнение,

  //сообщить, что выполнение процесса прекращено

  if (getProcessingState() == ProcessingState.requestAbort) {

   setProcessingState(ProcessingState.aborted);

  }

 }

 //Конец функции

 //Вспомогательная функция, которая проверяет, является

 //ли число простым

 private bool isItemPrime(long potentialPrime) {

  //Если число — четное, значит, оно не является простым

  if ((potentialPrime & 1) == 0) {

   return false;

  }

  //Продолжать поиск до тех пор, пока не будет превышено

  //значение квадратного корня из числа

  long end_point_of_search;

  end_point_of_search = (long) System.Math.Sqrt(potentialPrime) + 1;

  long current_test_item = 3;

  while (current_test_item <= end_point_of_search ) {

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

  // Проверить, не поступила ли команда прекратить выполнение!

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

  if (getProcessingState() != ProcessingState.lookingForPrime) {

   return false;

  }

  //Если число делится без остатка,

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

  if (potentialPrime % current_test_item == 0) {

   return false;

  }

  //Увеличить число на два

  current_test_item = current_test_item + 2;

 }

 //Число является простым return true;

 }

} //конец класса

В листинге 5.5 содержится код, который может быть помещен в форму для тестирования приведенного выше алгоритма фоновой обработки.

Листинг 5.5. Тестовая программа, которая вызывает на выполнение приведенный выше код фонового потока, осуществляющего поиск простого числа

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

// Код, обрабатывающий событие щелчка на кнопке Button1 формы

//

// Вызвать из этого потока функцию поиска простого числа!

// (Это приведет к блокированию потока)

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

private void button1_Click(object sender, System.EventArgs e) {

 long testItem;

 testItem = System.Convert.ToInt64("123456789012345");

 FindNextPrimeNumber nextPrimeFinder;

 nextPrimeFinder = new FindNextPrimeNumber(testItem);

 nextPrimeFinder.findNextHighestPrime();

 long nextHighestPrime;

 nextHighestPrime = nextPrimeFinder.getPrime();

 System.Windows.Forms.MessageBox.Show(System.Convert.ToString(nextHighestPrime));

 //Сколько времени заняли вычисления?

 int calculation_time;

 calculation_time = nextPrimeFinder.getTickCountDelta();

 System.Windows.Forms.MessageBox.Show(System.Convert.ToString(calculation_time) + " мс");

}

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

// Код, обрабатывающий событие щелчка на кнопке Button2 формы

//

// Вызвать функцию поиска простого числа из другого потока!

// (Данный поток блокироваться не будет)

// Для отслеживания состояния выполнения задачи используем конечный автомат

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

private void button2_Click(object sender, System.EventArgs e) {

 long testItem;

 testItem = System.Convert.ToInt64("123456789012345");

 FindNextPrimeNumber nextPrimeFinder;

45
{"b":"947732","o":1}