// =========================================================
// Периодическое обновление окна аплета 
// с использованием мультизадачности
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;

public class MultiTask extends Applet implements Runnable
{
  // Задача, которая будет обновлять окно аплета
  Thread	 m_MultiTask = null;

	// -------------------------------------------------------
  // MultiTask
  // Конструктор класса MultiTask. Не используется
  // -------------------------------------------------------
	public MultiTask()
	{
	}

	// -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
	{
		return "Name: MultiTask\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Author: Alexandr Frolov\r\n" +
      "Created with Microsoft Visual J++ Version 1.0";
	}

	// -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
  public void init()
	{
	}

	// -------------------------------------------------------
  // destroy
  // Метод, получающий управление при 
  // завершении работы аплета
  // -------------------------------------------------------
	public void destroy()
	{
	}

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
	  // Отображения строки со случайным числом
    g.drawString("Running: " + Math.random(), 10, 20);
	}

  // -------------------------------------------------------
  // start
  // Метод вызывается при первом отображении окна аплета
  // -------------------------------------------------------
	public void start()
	{
	  // Если задача еще не была создана, аплет создает
    // новую задачу как объект класса Thread, 
    // а затем запускает ее
    if (m_MultiTask == null)
		{
		  // Создание задачи
      m_MultiTask = new Thread(this);

      // Запуск задачи
			m_MultiTask.start();
		}
	}
	
  // -------------------------------------------------------
  // stop
  // Метод вызывается, когда страница с аплетом 
  // исчезает с экрана
  // -------------------------------------------------------
	public void stop()
	{
    // Когда пользователь покидает страницу с аплетом, 
    // метод stop останавливает задачу.
    // Остановка выполняется только в том случае,
    // если задача была создана
    if (m_MultiTask != null)
		{
			// Остановка задачи
      m_MultiTask.stop();

      // Сброс ссылки на задачу
			m_MultiTask = null;
		}
	}

	// -------------------------------------------------------
  // run
  // Метод, который работает в рамках отдельной задачи
  // Он вызывает периодическое обновление содержимого
  // окна аплета
  // -------------------------------------------------------
	public void run()
	{
    // Выполняем обновление окна в бесконечном цикле
    while (true)
		{
			try
			{
				// Вызываем функцию обновления окна
        repaint();

        // Выполняем небольшую задержку
				Thread.sleep(50);
			}
			catch (InterruptedException e)
			{
        // Если при выполнении задержки произошло
        // исключение, останавливаем работу задачи
				stop();
			}
		}
	}
}
