| |
одом drawString.
С этим, однако, есть небольшая сложность - метод drawString не может
отображать отдельные символы. Поэтому мы должны создать строку, состоящую из
одного символа и передать эту строку методу drawString.
Эта задача решается достаточно просто.
Прежде всего, мы определяем массив, состоящий из одного символа, и временную
текстовую строку s:
char[] ch;
String s;
ch = new char[1];
В самый первый элемент массива мы записываем текущий символ:
ch[0] = m_Str.charAt(nCurrentChar);
Затем мы создаем строку из массива, пользуясь конструктором, специально
предусмотренным для этой цели в классе String:
s = new String(ch);
Все! Теперь можно отображать строку, состоящую из одного символа, в текущей
позиции:
g.drawString(s, nCurrentXPos, yPos);
После отображения символа мы увеличиваем текущую позицию по горизонтальной
оси на ширину только что нарисованного символа, а затем переходим к следующему
символу в строке, увеличивая счетчик nCurrentChar:
nCurrentXPos += nCurrentCharWidth;
nCurrentChar++;
По идее после увеличения счетчика nCurrentChar мы должны были бы проверить
его значение на предмет выхода за границы строки, однако метод run поступает
лучше. При получении из строки символа с номером nCurrentChar при помощи метода
charAt возможно возникновение исключения StringIndexOutOfBoundsException,
которое и обрабатывается методом run.
При обработке исключения метод run сбрасывает номер текущего символа и
текущую позицию, перерисовывает окно аплета (в результате чего оно очищется), и
после выполнения задержки в полсекунды продолжает процедуру рисования символов.
Синхронизация задач
Мультизадачный режим работы открывает новые возможности для программистов,
однако за эти возможности приходится расплачиваться усложнением процесса
проектирования приложения и отладки. Основная трудность, с которой сталкиваются
программисты, никогда не создававшие ранее мультизадачные приложения, это
синхронизация одновременно работающих задач.
Для чего и когда она нужна?
Однозадачная программа, такая, например, как программа MS-DOS, при запуске
получает в монопольное распоряжение все ресурсы компьютера. Так как в
однозадачной системе существует только один процесс, он использует эти ресурсы
в той последовательности, которая соответствует логике работы программы.
Процессы и задачи, работающие одновременно в мультизадачной системе, могут
пытаться обращаться одновременно к одним и тем же ресурсам, что может привести
к неправильной работе приложений.
Поясним это на простом примере.
Пусть мы создаем программу, выполняющую операции с банковским счетом.
Операция снятия некоторой суммы денег со счета может происходить в следующей
последовательности:
* на первом шаге проверяется общая сумма денег, которая хранится на счете;
* если общая сумма равна или превышает размер снимаемой суммы денег, общая
сумма уменьшается на необходимую величину;
* значение остатка записывается на текущий счет.
Если операция уменьшения текущего счета выполняется в однозадачной системе,
то никаких проблем не возникнет. Однако представим себе, что два процесса
пытаются одновременно выполнить только что описанную операцию с одним и тем же
счетом.
|
|