Шрифт:
//Основной рабочий поток. Этот поток запускает поиск очередного
//простого числа и выполняется до тех пор, пока не произойдет
//одно из следующих двух событий:
// (а) найдено очередное простое число
// (b) от внешнего (по отношению к данному) потока поступила
// команда прекратить выполнение
//-------------------------------------------------------------
public void findNextHighestPrime {
//Если поступила команда прекратить выполнение, то поиск
//даже не должен начинаться
if (m_processingState == ProcessingState.requestAbort) {
goto finished_looking;
}
//Состояние должно отвечать, что поиск продолжается
setProcessingState(ProcessingState.lookingForPrime);
long currentItem;
//Проверить, является ли число нечетным
if ((m_startPoint & 1) == 1) {
//Число является нечетным, начать поиск со следующего нечетного числа
currentItem = m_startPoint + 2;
} else {
//Число является четным, начать поиск со следующего нечетного числа
currentItem = m_startPoint + 1;
}
//Приступить к поиску простого числа
while (m_processingState == ProcessingState.lookingForPrime) {
//B случае нахождения простого числа возвратить его
if (isItemPrime(currentItem) == true) {
m_NextHighestPrime = currentItem; //Обновить состояние
setProcessingState(ProcessingState.foundPrime);
}
currentItem = currentItem + 2;
}
finished_looking:
//Выход. К этому моменту либо от другого потока поступила
//команда прекратить поиск, либо было найдено и записано
//следующее наибольшее простое число
//Если поступил запрос прекратить выполнение,
//сообщить, что выполнение процесса прекращено
if (m_processingState == 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 (m_processingState != ProcessingState.lookingForPrime) {
return false;
}
//Если число делится без остатка,
//значит, оно не является простым
if (potentialPrime % current_test_item == 0) {
return false;
}
//увеличить число на два
current_test item = current_test_item + 2;