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

Листинг 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;
 nextPrimeFinder = new FindNextPrimeNumber(testItem);
 //------------------------------------
 // Выполнить обработку в другом потоке
 //------------------------------------
 nextPrimeFinder.findNextHighestPrime_Async();
 //Войти в цикл и ожидать до тех пор, пока не будет найдено
 //простое число или выполнение не будет прекращено
 while ((nextPrimeFinder.getProcessingState() != FindNextPrimeNumber.ProcessingState.foundPrime) &&
  (nextPrimeFinder.getProcessingState() != FindNextPrimeNumber.ProcessingState.aborted)) {
  //ТОЛЬКО В ТЕСТОВОМ КОДЕ:
  //Отобразить окно сообщений и предоставить пользователю
  //возможность убрать его с экрана.
  //Это позволяет организовать паузу!
  System.Windows.Forms.MessageBox.Show("Поиск продолжается... Щелкните на кнопке OK");
  //Мы могли бы прекратить поиск путем следующего вызова функции:
  //nextPrimeFinder.setProcessingState(
  // FindNextPrimeNumber.ProcessingState.requestAbort);
 }
 //Осуществить корректный выход в случае прекращения поиска
 if (nextPrimeFinder.getProcessingState() == FindNextPrimeNumber.ProcessingState.aborted) {
  System.Windows.Forms.MessageBox.Show("Поиск прекращен!");
  return;
 }
 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) + " мс");
}

Для выполнения примера с использованием указанного в листинге начального числа (123456789012345) на моем эмуляторе Pocket РС требовалось от 10 до 20 секунд. Исследуйте зависимость времени вычислений от количества цифр в начальном числе. (Как правило, с увеличением количества цифр время вычислений увеличивается.)

Оглавление книги


Генерация: 3.128. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз