// ==================================================
// CIS 790 PROF. AUCIELLO
/* THIS IS BASED ON F141 WHICH IS SINGLE-THREADED
AND VERY SLOW AT DISPLAYING IMAGES.
ATTEMPTS TO SPEED UP PROCESS WITH MULTI-THREADING
AND (1) OTHER PROGRAMMING TECHNIQUE.
Notes while programming:
The init() method (procedure) will be the 1st Thread.
This thread will load the arrays, which is time-consuming!
PUT THE LOADING OF ARRAYS INTO RUN(),
WHILE PAINT() DISPLAYS THE IMAGES.
Question: While the "delay flicker" loop in Paint is operating,
does the Load-Images routine steal cycles?
5:28am. Not threading ..
DEFINITIONS:
THREAD = SINGLE FLOW OF CONTROL WITHIN A PROGRAM.
runs on its own while rest of program
does other tasks. Demonstrates
"Multi-tasking" ability of Java.
MULTI-THREADING = MULTIPLE FLOWS OF CONTROL WITHIN PROGRAM.
Concurrent Activities.
Multi-Threads are not Parallelly-Processed.
Each Thread competes for CPU time.
Tasks with "POTENTIALLY LONG WAITS" should
run as "THREADS"!
When WAIT occurs, JAVA can shift to another
task for execution.
Topics:
Threading (allowing multi-threading)
Tracing Program Flow.
Applet Program Cycle
start(), run(), stop() methods.
Text -- setColor(Color.xxx)
Background Colors -- setBackground(Color.xxx)
Standard color names and RGB values.
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.*;
import java.io.*;
import java.lang.Math;
import java.lang.String;
import java.lang.Thread;
import java.lang.ThreadGroup;
import java.net.*;
import java.util.*;
import java.util.Date;
// extends runnable attributes to this applet (athread)
public class f201b extends java.applet.Applet implements Runnable
{
// define all global variables.
TextField inputField0,inputField1;
Font theFont = new Font("TimesRoman",Font.BOLD,16);
Date theDate;
Thread runner; // the thread address is in runner.
int x = 10;
Image currentgif; // THIS DEFINES currentgif AS AN IMAGE.
Image erasegif;
Image gifarray[] = new Image[150];
String namearray[] =
{
"BLUE.GIF",
"SD1.JPG",
"SD2.JPG",
"SD3.JPG",
"SD4.JPG",
"SD5.JPG",
"SD6.JPG",
"SD7.JPG",
"SD8.JPG",
"SD9.JPG",
"SF0.JPG",
"SF1.JPG",
"SF2.JPG",
"SF3.JPG",
"SF4.JPG",
"SF5.JPG",
"SF6.JPG",
"SF7.JPG",
"IMAGE0.GIF",
"IMAGE7A.GIF",
"ALAN.GIF",
"APRIL.GIF",
"N.JPG",
"H.JPG",
"J.JPG",
"ILDA.JPG",
"DALI.JPG",
"IMAGE001.JPG",
"MONICA.GIF",
"MAC.GIF",
"ESCOBEDO.GIF",
"MO3.JPG",
"MO6.JPG",
"W6.JPG",
"W8.JPG",
"BEATRIS.GIF",
"IMAGE6.GIF",
"IMAGE7A.GIF",
"IMAGE12.GIF",
"IMAGE14.GIF",
"IMAGE15.GIF",
"IMAGE16.GIF",
"IMAGE23.GIF"
};
int nal = namearray.length;
int ilc;
int speed = 30;
// if there is no thread, start one, shift to run().
public void init()
{ System.out.println("runner @ start() time = " + runner);
if ( runner == null);
{ runner = new Thread(this);
runner.start();
inputField0 = new TextField(80);// create, add, and
add (inputField0); // initialize input field1.
inputField0.setText(" SLIDE SHOW JAVA APPLET PROGRAMMING (CIS 790) PROF. J. AUCIELLO");
Label namelabel4 = new Label("Speed: 1=fast 300=slow",Label.RIGHT);
add (namelabel4); // def and add label.
inputField1 = new TextField(7); // create, add, and
add (inputField1); // initialize input field1.
inputField1.setText("68");
Button button1 = new Button("Start"); // def button.
add(button1);
}
}
// control "c" takes control here.
public void stop()
{ if (runner != null); // if not equal null, make it = null.
{ runner.stop();
runner = null;
System.out.println("runner @ stop() time = " + runner);
}
}
// infinite loop, gets and converts date, takes 1 second nap,
// Java Run System leaves this routine briefly to attend to
// paint() routine.
public void run()
{ // start run()
{ System.out.println("Loading Thread is running -- (loading) run() method");
System.out.println(" loading(1) = " + runner);
try
{ System.out.println("Timer Thread is running -- (timer) run() method");
System.out.println(" run(1) = " + runner);
for ( int i=0; i < nal; i++ )
{ gifarray[i] = getImage(getCodeBase(),namearray[i]); }
// block started and ended.
Thread.sleep(1000);
String s1 = inputField1.getText();
speed = Integer.parseInt(s1);
} //sleeps 10000 msecs.
catch
(InterruptedException e) {}
}
} // ends run.
// ==============================================================
// this displays images.
public void paint(Graphics g)
{
// start 'paint'
int x = 1;
int hor = 1;
String yourname = "f201b: PROF. AUCIELLO'S GALLERY (loading images into array ... ) ";
Font fs = new Font("Sans Serif", Font.BOLD, 12);
Font fm = new
Font("Monospaced", Font.BOLD, 14);
String s2 = inputField1.getText();
speed = Integer.parseInt(s2);
g.setFont(fs);
setBackground(Color.blue);
g.setColor(Color.yellow);
g.setFont(fm);
hor = 220;
ilc = 1;
outerloop: while ( ilc < nal )
{ // start outerloop.
g.drawString(yourname, 20, 70);
String strvar = namearray[ilc];
g.setColor(Color.red);
g.drawString(strvar, 375, 85);
g.drawString(yourname, 20, 70);
g.drawString("Speed = " + speed, 275, 85);
erasegif = gifarray[0];
g.drawImage(erasegif, hor-80, 100, this);
currentgif = gifarray[ilc];
if (currentgif != null)
{
g.drawImage(currentgif, hor-80, 100, this);
x = 1;
while ( x < speed ) // (12 = 2 sec delay) (50 = 10 sec delay)
// delay to reduce flicker.
// syntax of "while"
{ System.out.println("x = " + x);
g.drawString(" " + x, 1, 1);
x ++;
} // 'while started and ended
g.setColor(Color.blue);
g.drawString(strvar, 375, 85);
repaint();
} // end "if"
ilc = ilc + 1;
} // end 'outerloop'
} // end paint()
public boolean action(Event event, int speed)
{
String s1 = inputField1.getText();
speed = Integer.parseInt(s1);
repaint();
return true;
}
} // end program