Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:
//команда прекратить поиск, либо было найдено и записано
//следующее наибольшее простое число
//Зафиксировать время
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;
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);
Поделиться с друзьями: