Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: А.В. Фролов, Г.В. Фролов - Microsoft Visual J++
<<-[Весь Текст]
Страница: из 275
 <<-
 
  dimAppWndDimension.height - 1);
  }

  // -------------------------------------------------------
  // start
  // Метод вызывается при первом отображении окна аплета
  // -------------------------------------------------------
  public void start()
  {
    if (m_DrawRectThread == null)
    {
      m_DrawRectThread = new DrawRectangles(this);
      m_DrawRectThread.start();
    }

    if (m_NotifyTaskThread == null)
    {
      // Создаем задачу, передавая ей ссылку на
      // задачу рисования прямоугольников, которую
      // необходимо периодически разблокировать
      m_NotifyTaskThread = new NotifyTask(m_DrawRectThread);
      m_NotifyTaskThread.start();
    }
  }
	
  // -------------------------------------------------------
  // stop
  // Метод вызывается, когда окно аплета исчезает с экрана
  // -------------------------------------------------------
  public void stop()
  {
    if (m_DrawRectThread != null)
    {
      m_DrawRectThread.stop();
      m_DrawRectThread = null;
    }

    if (m_NotifyTaskThread != null)
    {
      m_NotifyTaskThread.stop();
      m_NotifyTaskThread = null;
    }
  }
}

// =========================================================
// Класс задачи для рисования прямоугольников
// =========================================================
class DrawRectangles extends Thread
{
  // Контекст отображения окна аплета
  Graphics g;

  // Размеры окна аплета
  Dimension dimAppWndDimension;

  // -------------------------------------------------------
  // DrawRectangles
  // Конструктор класса DrawRectangles
  // -------------------------------------------------------
  public DrawRectangles(Applet Appl)
  {
    // Получаем и сохраняем контекст отображения
    g = Appl.getGraphics();

    // Определяем текущие размеры окна аплета
    dimAppWndDimension = Appl.size();
  }

  // -------------------------------------------------------
  // run
  // Метод, который работает в рамках отдельной задачи
  // Он рисует в окне аплета прямоугольники случайного
  // цвета, размера и расположения
  //
  // Этот метод должен быть определен как synchronized
  // -------------------------------------------------------
  public synchronized void run()
  {
    while (true)
    {
      int x, y, width, height;
      int rColor, gColor, bColor;
      
      // Выбираем случайным образом размеры
      // и расположение рисуемого прямоугольника
      x = (int)(dimAppWndDimension.width * 
          Math.random());
      y = (int)(dimAppWndDimension.height * 
          Math.random());
      width  = (int)(dimAppWndDimension.width * 
          Math.random()) / 2;
      height = (int)(dimAppWndDimension.height * 
          Math.random()) / 2;
      
      // Выбираем случайный цвет для рисования 
      // прямоугольника
      rColor = (int)(255 * Math.random());
      gColor = (int)(255 * Math.random());
      bColor = (int)(255 * Math.random());

      // Устанавливаем выбранный цвет в контексте 
      // отображения
      g.setColor(new Color(rColor, gColor, bColor));

      // Рисуем прямоугольник
      g.fillRect(x, y, width, height);

      // Переводим задачу в сотояние ожидания, в котором
      // она будет находиться до тех пор, пока не будет
      // разблокирована задачей класса NotifyTask
      try
      {
        Thread.wait();
      }
      catch (InterruptedException e)
      {
      }
    }
  }
}

// =========================================================
// Класс задачи для периодического разблокирования
// задачи рисования прямоугольников
// =========================================================
class NotifyTask extends Thread
{
  // Ссылка на задачу, которую необходимо разблокировать
  Thread STask;

  // -------------------------------------------------------
  // Конструктор класса NotifyTask
  // -------------------------------------------------------
  public NotifyTask(Thread SynchroTask)
  {
    // Сохраняем ссылку на задачу, которую необходимо
    // разблокировать
    STask = SynchroTask;
  }

  // -------------------------------------------------------
  // run
  // Метод, который работает в рамках отдельной задачи и
  // периодически разблокирует задачу STask
  // -------------------------------------------------------
  public void run()
  {
    while (true)
    {
      // Выполняем задержку на 30 миллисекунд
      try
      {
        Thread.sleep(30);
      }
      catch (InterruptedException e)
      {
      }

      // Получаем объект STask в монопольное владение
      // и вызываем для него метод notify, 
      // разблокируя работу соотвестсвующей задачи
      synchronized(STask)
      {
        STask.notify();
      }
    }
  }
}
   Файл документа HTML, созданный автоматически для нашего аплета, вы найдете в 
листинге 1.12.
Листинг 1.12. Файл Synchro\Synchro.html


Synchro




The source. Описание исходных
 
<<-[Весь Текст]
Страница: из 275
 <<-