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

ЖАНРЫ

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

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;

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

}

//Осуществить корректный выход в случае прекращения поиска

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