Problem with createImage =(
I just started working with J2ME a few weeks ago, right now I'm trying to create a sprite but it keeps giving me the same error saying:
44: unreported exception java.io.IOException; must be caught or declared to be thrown
Image img = Image.createImage("/player.png");
The actual coding goes like this:
Image img = Image.createImage("/player.png");
playerSprite = new Sprite(img, 24, 32);
playerSprite.setFrame(25);
Can anyone please tell me what went wrong? Thanks a lot!
Hi,
this implies that ur code must be within a try catch block.
try{
Image img = Image.createImage("/player.png");
catch(IOException e){
}
Similar Messages
-
Problem in createImage...
Hi,
I am facing a distinctive problem with createImage method in BlackBerry simulator & blackberry device.
I developed the code in WTK2.5.1,first i am creating an image with width & height, then i am drawing some string inside that.The String width and the Image width are same.And create three images like that & then draw all the three images serially with no space between two,and the problem is it is showing ok in WTK but in Blackberry simulator & device it is showing extra space between them.I made the code using java APIs,not did not use any BlackBerry API.
My question is why the image is showing greater than the string width? Is there any problem of creating images or font what i am using between java & Blackberry API ??
Please help me,it's urgent,
Because the whole thing is done but this small thing is creating problem.
Regards,
Susanta..My best guess is that the text you are drawing to the images is actually not the same size as the image because of a difference in the font, and when you expect the image to be the same length as the text, there is a gap.
This is only going to be guess work without seeing the code you use to create and draw your images. Could you post some code? -
Problem with Image.createImage()
Hi all!
I'm writing a simple midlet just to display an image on the screen and I'm having some problems with Image.createImage()
Here is my code
Image bg_img;
ImageItem imageItem1;
imageItem1 = new ImageItem("", null,ImageItem.LAYOUT_DEFAULT, "");
try{
bg_img = Image.createImage("/image.png");
imageItem1.setImage(bg_img);
catch(java.io.IOException e){
e.printStackTrace();
I'm getting an exception on bg_img = Image.createImage("/image.png");
I can't understand what is it...:(
I know for sure that the problem is not "file not found"
Any one can help me???If you are catching IOException, then u may have problem with ur image path. "image not found on the specified path." if ur image is not in the current directiry then put it into current directory. otherwise, If u are using resouce folder and it is already included into the resouce path, then put ur image in that folder..try this..
Still not get, then please give some detail about ur development toolkit. and ur apllication packaging scheem. are you using ANT?
Pranav -
Problems with MemoryImageSource and createImage
Hi!
As my headline says it, I have a problem with MemoryImageSource and createImage. Whenever I create an image from a memory buffer I get an image that has the wrong dimensions: the width and height are swapped, but the image seems to be all right. I tried to create the image ov top of a JPanel using the Container methods. Any suggestions as of how to solve this problem would be greatly appreciated.
Here is the code that I am using:
public class ImageCanvas extends JPanel
private Dimension SD;
private Image Img;
byte [][] ImageBuffer=new [150][100];
public ImageCanvas()
this(100,150,ImgBuffer);
public ImageCanvas(int sx,int sy,byte[][] buff)
D=new Dimension(sx,sy);
SD=new Dimension(sx,sy);
setSize(D);
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
setVisible(true);
int [] ipix=new int[sx*sy];
if(buff.equals(ImgBuffer)==false){
ImgBuffer=new byte[sy][sx];
for(int j=0;j<sy;j++){
System.arraycopy(buff[j],0,ImgBuffer[j],0,sx);
/* ARGB */
for(int j=0;j<sy;j++){
for(int i=0;i<sx;i++){
ipix[j*sx + i]=(0xFF000000 |
((ImgBuffer[j] << 16) & 0x00FF0000) |
((ImgBuffer[j][i] << 8) & 0x0000FF00) |
(ImgBuffer[j][i] & 0x000000FF));
Img = createImage(new MemoryImageSource(sx,sy,ipix,0,sx));
private void SetImage(byte[][] pixels)
int sx=pixels[0].length;
int sy=pixels.length;
SD.width=sx;
SD.height=sy;
if(ImgBuffer[0].length != sx && ImgBuffer.length != sy){
ImgBuffer = new byte[sy][sx];
for(int j=0;j<sy;j++){
System.arraycopy(pixels[j],0,ImgBuffer[j],0,sx);
int [] ipix=new int[sx*sy];
for(int i=0;i<sx;i++){
for(int j=0;j<sy;j++){
/* ARGB */
ipix[j*sx + i]=(0xFF000000 |
((ImgBuffer[j][i] << 16) & 0x00FF0000) |
((ImgBuffer[j][i] << 8) & 0x0000FF00) |
(ImgBuffer[j][i] & 0x000000FF));
Img = createImage(new MemoryImageSource(sx,sy,ipix,0,sx));
protected void paintComponent(Graphics g)
paint(g);
public void paint(Graphics g)
g.drawImage(Img,0,0,SD.height,SD.width,null);If you are going to ask question about your code, at least post a working code.
The code you posted contains so many syntactic and semantic errors that nobody would bother to fix. -
Problem with repaint of display after a click event
Hi,
I have a problem with repaint of display. In particular in method keyPressed() i inserted a statement that, after i clicked bottom 2 of phone, must draw a string. But this string doesn't drawing.
Instead if i reduce to icon the window, which emulate my application, and then i enlarge it, i see display repainted with the string.
I don't know why.
Any suggestions?
Please help me.modified your code little
don't draw in keyPressed
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class PlayerCanvas extends Canvas implements CommandListener{
Display display;
Displayable dsp11;
private Image play, pause, stop, next, previous = null;
private int gamcode;
private Command quitCmd = new Command("Back", Command.ITEM, 1);
public PlayerCanvas(Display display,Displayable dsp11){
this.display =display;
this.dsp11 =dsp11;
addCommand(quitCmd);
createController();
setCommandListener(this);
display.setCurrent(this);
protected void paint(Graphics g)
g.setColor(255,200,150);
g.fillRect(0, 0, getWidth(), getHeight());
if (play != null){
g.drawImage(play, getWidth()/5, getHeight()-50, Graphics.BOTTOM | Graphics.HCENTER);
if (stop != null){
g.drawImage(stop, getWidth()/5, getHeight()-10, Graphics.BOTTOM | Graphics.HCENTER);
if (next != null){
g.drawImage(next, (getWidth()/5)+10, getHeight()-30, Graphics.BOTTOM | Graphics.LEFT);
if (previous != null){
g.drawImage(previous, (getWidth()/5)-30, getHeight()-30, Graphics.BOTTOM | Graphics.LEFT);
/////this will draw on key UP
g.setColor(0,0,0);
System.out.print(gamcode);
if(gamcode==Canvas.UP){
g.drawString("PROVA",10, 0, 0);
}else if(gamcode==Canvas.DOWN){
g.drawString("DIFFERENT",10, 30, 0);
private void createController()
try {
play = Image.createImage("/icon3.png");//replace your original images plz
pause = Image.createImage("/icon3.png");
stop = Image.createImage("/icon3.png");
next = Image.createImage("/icon3.png");
previous = Image.createImage("/icon3.png");
} catch (IOException e) {
play = null;
pause = null;
stop = null;
next = null;
previous = null;
if (play == null){
System.out.println("cannot load play.png");
if (pause == null){
System.out.println("cannot load pause.png");
if (stop == null){
System.out.println("cannot load stop.png");
if (next == null){
System.out.println("cannot load next.png");
if (previous == null){
System.out.println("cannot load previous.png");
protected void keyPressed(int keyCode)
repaint();
if ( (keyCode == 2) || (UP == getGameAction(keyCode)) ){
gamcode = UP;
repaint();
else if ( (keyCode == 8) || (DOWN == getGameAction(keyCode)) ){
gamcode =DOWN;
repaint();
else if ( (keyCode == 4) || (LEFT == getGameAction(keyCode)) ){
else if ( (keyCode == 6) || (RIGHT == getGameAction(keyCode)) ){
public void commandAction(Command arg0, Displayable arg1) {
// TODO Auto-generated method stub
if(arg0==quitCmd){
display.setCurrent(dsp11);
} -
Problem with getting resized image's bytes
I've got a problem with getting correct bytes of a newly resized image. The flow is that I retrive an image from the filesystem. Due to the fact that it is large I resize it to a 50x50px thumbnail. I can display this thumbnail in #benchmark1 (see code below). Unfortunately something's wrong with my imageToBytes funtion which returns reasonably small size of image but is totally useless - I can't make an image of it anymore so at #benchmark2 the application either crashes or keeps freezing. I saved this byte array on my disk and tried to preview under Windows how does it look but I got a message "Preview unavailabe". I did some digging in the Internet and I supposed that it's because I don't use any jpg or png encoders to save the file. Actually I think that it's not the case, as the bytes returned from method imageToBytes look weird - I cannot even make a new image of them and display it without any saving in memory.
byte[] bytes = FileHandler.readFile (
FileHandler.PHOTOS_PATH, fileName);
Image img2 = Image.createImage (bytes, 0, bytes.length);
img2 = ImageHandler.getInstance ().resize (img2);
//#benchmark1
bytes = ImageUtils.imageToBytes (img2);
img2 = Image.createImage (bytes, 0, bytes.length);
//#benchmark2my imageToBytes function is as follows:
public static byte[] imageToBytes (Image img)
int[] imgRgbData = new int[img.getWidth () * img.getHeight ()];
byte[] imageData = null;
try
img.getRGB (imgRgbData, 0, img.getWidth (), 0, 0, img.getWidth (),
img.getHeight ());
catch (Exception e)
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
DataOutputStream dos = new DataOutputStream (baos);
try
for (int i = 0; i < imgRgbData.length; i++)
dos.writeInt (imgRgbData);
imageData = baos.toByteArray ();
baos.close ();
dos.close ();
catch (Exception e)
return imageData;
I've run totally out of any idea what's wrong, please help!
Edited by: crawlie on Jul 17, 2010 6:21 PMHey Crawlie,
Please note that simply writing int values into ByteArrayOutputStream will not suffice. Please have a look at the following conversion from int pixel value into byte[4]:
public static final byte[] intToByteArray(int value) {
return new byte[] {
(byte)(value >>> 24),
(byte)(value >>> 16),
(byte)(value >>> 8),
(byte)value
}Good Luck!
Daniel -
Problem With BufferImage.
Hi!
I have a problem with creating a bufferimage. It compiles just fine but when I run it I get a NullPointerException... Can anyone tell my why and what I shall do to make it work?
public class Meadow extends JFrame{
private MediaTracker tracker;
private Toolkit toolkit;
private Dimension screenSize;
private Image bufferImage;
private Graphics bufferGraphics;
private ImageIcon meadowIcon;
private Image meadowImage;
private ImageIcon sentinelIcon;
private Image sentinelImage;
private Container contentPane;
private Graphics graphics;
public Meadow(){
tracker = new MediaTracker(this);
toolkit = getToolkit();
screenSize = toolkit.getScreenSize();
bufferImage = createImage(screenSize.width, screenSize.height);
tracker.addImage(bufferImage, 0);
try{
tracker.waitForID(0);
}//end try
catch (InterruptedException e){
return;
}//end catch
if(tracker.statusID(0, false) == MediaTracker.COMPLETE){
nullpointer---> bufferGraphics = bufferImage.getGraphics();
}//end if
meadowIcon = new ImageIcon("meadow.gif");
meadowImage = meadowIcon.getImage();
sentinelIcon = new ImageIcon("Grapghic/Sentinel/sentinel_0.gif");
sentinelImage = sentinelIcon.getImage();
setBounds(0, 0, screenSize.width, screenSize.height);
getContentPane().setLayout(null);
setUndecorated(true);
setResizable(false);
setVisible(true);
graphics = getContentPane().getGraphics();
drawScreen();
}//end constructor Meadow
}//end class Meadow
Gratefull for any answers I can get!
//Johnok... Im getting closer to the root of the problem... But I could still use some help...
bufferImage = createImage(screenSize.width, screenSize.height);
if (bufferImage == null){
System.out.println("crap");
bufferGraphics = bufferImage.getGraphics(); <---This gives a nullpointer
Ok... The above lines givs a nullpointer but just before it does, "crap" is printed... I,we read that createImage returns null if graphicEnviroment.isHeadless returns true... And if I get everything right that meens that the graphic eniroment doesn't support the image I'm trying to create...
Am I way off here or have I got it right? And if it is that way, how can I make the graphicEnviroment support my image?
I appreciate all help I can get!
//John
ps Thanx Nelo! Your replie helped me with another problem I've been struggling with! ds -
Problem with loading image to Applet.
Hello. Im preety new to Java, and currently ive got problems with adding an image to my applet. I tried to make game, similar to Mario - a platform based one. I found a source code of something close to that, and wanted to test but i couldnt get images loading. Here's the code :
Main class :
package pl.wat.edu;
import java.applet.*;
import java.awt.*;
public class Main extends Applet implements Runnable{
Thread th;
private final int speed = 15;
private Level obecny_poziom;
private Image dbImage;
private Graphics dbg;
MediaTracker mt = new MediaTracker(this);
private Image ziemia1;
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
@Override
public void init() {
// TODO Auto-generated method stub
super.init();
setSize(stale.wielkosc_apletu_szerokosc, stale.wielkosc_apletu_wysokosc);
//setBackground(Color.blue);
//ziemia1 = getImage(getCodeBase(), "g1.GIF");
obecny_poziom = new Pierwszy(this, this);
@Override
public void start() {
// TODO Auto-generated method stub
super.start();
// create new thread
th = new Thread (this);
// start thread
th.start ();
@Override
public void stop() {
// TODO Auto-generated method stub
super.stop();
// Thread stop
th.stop();
th = null;
public void run() {
// TODO Auto-generated method stub
while (true){
repaint();
try
Thread.sleep(speed);
catch (InterruptedException ex)
// do nothing
@Override
public void paint(Graphics arg0) {
// TODO Auto-generated method stub
super.paint(arg0);
//arg0.drawImage(ziemia1,10,10,this);
obecny_poziom.paintLevel(arg0);
public void update (Graphics g)
if (dbImage == null)
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
dbg.setColor (getForeground());
paint(dbg);
g.drawImage (dbImage, 0, 0, this);
}and Level class that have draw levels from String rows :
package pl.wat.edu;
import java.applet.Applet;
import java.awt.*;
public abstract class Level {
//private LevelElement [] elements;
private WorldTile [] tiles;
private WorldTile[][] tablica_kolizji;
private Color [] colors;
private Component parent;
private int lewa_granica;
private int prawa_granica;
private int dlugosclevelu;
private Image ziemia = null;
private Image titi;
private Applet applet;
public abstract void resetLevel();
public Level(Component parent, Applet applet) {
super();
this.parent = parent;
this.applet = applet;
ziemia = applet.getImage(applet.getCodeBase(), "g1.GIF");
public void initializeLevel(String [] definitions){
tablica_kolizji = new WorldTile [stale.dlugosclevela] [definitions[0].length()];
lewa_granica = 0;
prawa_granica = stale.wielkosc_apletu_szerokosc;
int licznik_kratek = 0;
for(int i=0; i<definitions.length; i++){
char [] definition_line = definitions.toCharArray();
for(int j=0; j<definition_line.length; j++){
if (definition_line[j] == ':')
tablica_kolizji[i][j] = null;
else if (definition_line[j]== 'g'){
Ziemia tile = new Ziemia(j*stale.szerokoscTile, i*stale.wysokoscTile, stale.ziemia_id, ziemia, parent);
tablica_kolizji[i][j] = tile;
licznik_kratek = 0;
tiles = new WorldTile [licznik_kratek];
int licznik = 0;
for (int i = 0; i<tablica_kolizji.length; i++){
for(int j=0; j>tablica_kolizji[i].length; j++){
if (tablica_kolizji[i][j] != null){
tiles[licznik] = tablica_kolizji[i][j];
licznik++;
public void paintLevel(Graphics g)
try
// draw background
// draw all elements in elements array
for(int i=0; i<tiles.length; i++)
tiles[i].rysujTile(g);
catch(Exception ex)
// do nothing
Any ideas why this Image doesnt show up ?michali7x4s1 wrote:
Thats a code i found somewhere, tried to check how some things work.Have you used exceptions before? If not, please read the sun tutorial on them as they are very very important. Also, whether this is your code or someone else's doesn't matter as it's yours now, and you would be best served by never throwing out exceptions as is done in this code. It's like driving with a blindfold on and then wondering why you struck the tree. It's always best to go through the tutorials to understand code before using it. If it were my project, I'd do it in Swing, not AWT. Fortunately Sun has a great tutorial on how to code in Swing, and I suggest you head there as well. Best of luck. -
FrameGrabbingControl - grab frame problem with video type
Hi all
I have a problem with extracting frames from a video.
Currently I am able to extracting video from some avi formats. But this method does not works for many formats. like mpg etc...
The FrameGrabbingControl object return null for many formats.
This is my code
public Player getVideoPlayer() throws Exception
if (videoPlayer == null)
File file = new File("E:\\Songs\\English\\Video\\Alizee\\20090209114235.avi");
MediaLocator videoMediaLocator = new MediaLocator(file.toURL());
videoPlayer = Manager.createRealizedPlayer(videoMediaLocator);
return videoPlayer;
public FrameGrabbingControl getFrameGrabCntrl() throws Exception
if (frameGrabCntrl == null)
frameGrabCntrl = (FrameGrabbingControl) getVideoPlayer().getControl("javax.media.control.FrameGrabbingControl");
return frameGrabCntrl;
// frame extract method
public Image captureCurrent() throws Exception
Buffer frame = getFrameGrabCntrl().grabFrame();
BufferToImage stopBuffer = new BufferToImage((VideoFormat) frame.getFormat());
return stopBuffer.createImage(frame);
}Here are some 3 sample media information I have tested with the program. First two works fine but 3rd one does not works.
// taken from http://www.exactfutures.com/index02.htm and downloaded http://www.exactfutures.com/vid2jpg.zip
// WORKS FINE
General
Complete name : E:\Songs\English\Video\Alizee\testcam04.avi
Format : AVI
Format/Info : Audio Video Interleave
Format/Family : RIFF
File size : 1.88 MiB
PlayTime : 29s 596ms
Bit rate : 533 Kbps
Video #0
Codec : Indeo 4
Codec/Info : Intel Indeo Video 5.0 Wavelet
PlayTime : 29s 596ms
Bit rate : 528 Kbps
Width : 320 pixels
Height : 240 pixels
Aspect ratio : 4/3
Frame rate : 3.818 fps
Bits/(Pixel*Frame) : 1.801
// recorded video from a webcam
// WORKS FINE
General
Complete name : C:\Program Files\MSI\MyGuard Live\VideoClip\20090209114235.avi
Format : AVI
Format/Info : Audio Video Interleave
Format/Family : RIFF
File size : 311 KiB
PlayTime : 3s 200ms
Bit rate : 710 Kbps
Video #0
Codec : Indeo 4
Codec/Info : Intel Indeo Video 5.0 Wavelet
PlayTime : 3s 200ms
Bit rate : 705 Kbps
Width : 640 pixels
Height : 480 pixels
Aspect ratio : 4/3
Frame rate : 15.000 fps
Bits/(Pixel*Frame) : 0.153
// downloaded avi sample video
// NOT WORKS
General
Complete name : E:\Songs\English\Video\Alizee\fvss_demo.avi
Format : AVI
Format/Info : Audio Video Interleave
Format/Family : RIFF
File size : 10.3 MiB
PlayTime : 2mn 300ms
Bit rate : 715 Kbps
Video #0
Codec : MS Video
Codec/Info : Microsoft Video 1
PlayTime : 2mn 300ms
Bit rate : 638 Kbps
Width : 160 pixels
Height : 120 pixels
Aspect ratio : 4/3
Frame rate : 10.000 fps
Bits/(Pixel*Frame) : 3.325
Audio #1
Codec : PCM
Codec/Family : PCM
Codec/Info : Microsoft PCM
PlayTime : 2mn 300ms
Bit rate : 64 Kbps
Channel(s) : 1 channel
Sampling rate : 8000 Hz
Resolution : 8 bitsI think problem is the codec. Am I correct?
Could anyone please tell me why can't I use this FrameGrabbingControl object to extract frames?deshan wrote:
Currently I am able to extracting video from some avi formats. But this method does not works for many formats. like mpg etc...
The FrameGrabbingControl object return null for many formats.That's expected behavior when the codec doesn't support capture...
Could anyone please tell me why can't I use this FrameGrabbingControl object to extract frames?Because it's not supported for that format.
But T.B.M. and I have recently worked on / posted a workaround that should capture any video format that JMF can play.
[http://forums.sun.com/thread.jspa?messageID=10596692#10596692] -
I am trying to implement some kind of a server listening for requests. The listener part of the app, is a daemon thread that listens for connections and instantiates a handling daemon thread once it gets some. However, my problem is that i must be able to kill the listening thread at the user's will (say via a sto button). I have done this via the Sun's proposed way, by testing a boolean flag in the loop, which is set to false when i wish to kill the thread. The problem with this thing is the following...
Once the thread starts excecuting, it will test the flag, find it true and enter the loop. At some point it will LOCK on the server socket waiting for connection. Unless some client actually connects, it will keep on listening indefinatelly whithought ever bothering to check for the flag again (no matter how many times you set the damn thing to false).
My question is this: Is there any real, non-theoretical, applied way to stop thread in java safely?
Thank you in advance,
LeftyThis was one solution from the socket programming forum, have you tried this??
public Thread MyThread extends Thread{
boolean active = true;
public void run(){
ss.setSoTimeout(90);
while (active){
try{
serverSocket = ss.accept();
catch (SocketTimeoutException ste){
// do nothing
// interrupt thread
public void deactivate(){
active = false;
// you gotta sleep for a time longer than the
// accept() timeout to make sure that timeout is finished.
try{
sleep(91);
}catch (InterruptedException ie){
interrupt();
} -
Problem with Threads and a static variable
I have a problem with the code below. I am yet to make sure that I understand the problem. Correct me if I am wrong please.
Code functionality:
A timer calls SetState every second. It sets the state and sets boolean variable "changed" to true. Then notifies a main process thread to check if the state changed to send a message.
The problem as far I understand is:
Assume the timer Thread calls SetState twice before the main process Thread runs. As a result, "changed" is set to true twice. However, since the main process is blocked twice during the two calls to SetState, when it runs it would have the two SetState timer threads blocked on its synchronized body. It will pass the first one, send the message and set "changed" to false since it was true. Now, it will pass the second thread, but here is the problem, "changed" is already set to false. As a result, it won't send the message even though it is supposed to.
Would you please let me know if my understanding is correct? If so, what would you propose to resolve the problem? Should I call wait some other or should I notify in a different way?
Thanks,
B.D.
Code:
private static volatile boolean bChanged = false;
private static Thread objMainProcess;
protected static void Init(){
objMainProcess = new Thread() {
public void run() {
while( objMainProcess == Thread.currentThread() ) {
GetState();
objMainProcess.setDaemon( true );
objMainProcess.start();
public static void initStatusTimer(){
if(objTimer == null)
objTimer = new javax.swing.Timer( 1000, new java.awt.event.ActionListener(){
public void actionPerformed( java.awt.event.ActionEvent evt){
SetState();
private static void SetState(){
if( objMainProcess == null ) return;
synchronized( objMainProcess ) {
bChanged = true;
try{
objMainProcess.notify();
}catch( IllegalMonitorStateException e ) {}
private static boolean GetState() {
if( objMainProcess == null ) return false;
synchronized( objMainProcess ) {
if( bChanged) {
SendMessage();
bChanged = false;
return true;
try {
objMainProcess.wait();
}catch( InterruptedException e ) {}
return false;
}Thanks DrClap for your reply. Everything you said is right. It is not easy to make them alternate since SetState() could be called from different places where the state could be anything else but a status message. Like a GREETING message for example. It is a handshaking message but not a status message.
Again as you said, There is a reason I can't call sendMessage() inside setState().
The only way I was able to do it is by having a counter of the number of notifies that have been called. Every time notify() is called a counter is incremented. Now instead of just checking if "changed" flag is true, I also check if notify counter is greater than zero. If both true, I send the message. If "changed" flag is false, I check again if the notify counter is greater than zero, I send the message. This way it works, but it is kind of a patch than a good design fix. I am yet to find a good solution.
Thanks,
B.D. -
Problem with threads running javaw
Hi,
Having a problem with multi thread programming using client server sockets. The program works find when starting the the application in a console using java muti.java , but when using javaw multi.java the program doesnt die and have to kill it in the task manager. The program doesnt display any of my gui error messages either when the server disconnect the client. all works find in a console. any advice on this as I havent been able to understand why this is happening? any comment would be appreciated.
troy.troy,
Try and post a minimum code sample of your app which
does not work.
When using javaw, make sure you redirect the standard
error and standard output streams to file.
Graeme.Hi Graeme,
I dont understand what you mean by redirection to file? some of my code below.
The code works fine under a console, code is supposed to exit when the client (the other server )disconnects. the problem is that but the clientworker side of the code still works. which under console it doesnt.
public class Server{
ServerSocket aServerSocket;
Socket dianosticsSocket;
Socket nPortExpress;
ClientListener aClientListener;
LinkedList queue = new LinkedList();
int port = 0;
int clientPort = 0;
String clientName = null;
boolean serverAlive = true;
* Server constructor generates a server
* Socket and then starts a client threads.
* @param aPort socket port of local machine.
public Server(int aPort, String aClientName, int aClientPort){
port = aPort;
clientName = aClientName;
clientPort = aClientPort;
try{
// create a new thread
aServerSocket = new ServerSocket(port) ;
// connect to the nPortExpress
aClientListener = new ClientListener(InetAddress.getByName(clientName), clientPort, queue,this);
// aClientListener.setDaemon(true);
aClientListener.start();
// start a dianostic port
DiagnosticsServer aDiagnosticsServer = new DiagnosticsServer(port,queue,aClientListener);
// System.out.println("Server is running on port " + port + "...");
// System.out.println("Connect to nPort");
catch(Exception e)
// System.out.println("ERROR: Server port " + port + " not available");
JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Server port " + port + " not available", JOptionPane.ERROR_MESSAGE);
serverAlive = false;
System.exit(1);
while(serverAlive&&aClientListener.hostSocket.isConnected()){
try{
// connect the client
Socket aClient = aServerSocket.accept();
//System.out.println("open client connection");
//System.out.println("client local: "+ aClient.getLocalAddress().toString());
// System.out.println("client localport: "+ aClient.getLocalPort());
// System.out.println("client : "+ aClient.getInetAddress().toString());
// System.out.println("client port: "+ aClient.getLocalPort());
// make a new client thread
ClientWorker clientThread = new ClientWorker(aClient, queue, aClientListener, false);
// start thread
clientThread.start();
catch(Exception e)
//System.out.println("ERROR: Client connection failure");
JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Client connection failure", JOptionPane.ERROR_MESSAGE);
}// end while
} // end constructor Server
void serverExit(){
JOptionPane.showMessageDialog(null, "Server ","ERROR: nPort Failure", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}// end class Server
*** connect to another server
public class ClientListener extends Thread{
InetAddress hostName;
int hostPort;
Socket hostSocket;
BufferedReader in;
PrintWriter out;
boolean loggedIn;
LinkedList queue; // reference to Server queue
Server serverRef; // reference to main server
* ClientListener connects to the host server.
* @param aHostName is the name of the host eg server name or IP address.
* @param aHostPort is a port number of the host.
* @param aLoginName is the users login name.
public ClientListener(InetAddress aHostName, int aHostPort,LinkedList aQueue,Server aServer) // reference to Server queue)
hostName = aHostName;
hostPort = aHostPort;
queue = aQueue;
serverRef = aServer;
// connect to the server
try{
hostSocket = new Socket(hostName, hostPort);
catch(IOException e){
//System.out.println("ERROR: Connection Host Failed");
JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Connection to nPort Failed", JOptionPane.ERROR_MESSAGE);
System.exit(0);
} // end constructor ClientListener
** multi client connection server
ClientWorker(Socket aSocket,LinkedList aQueue, ClientListener aClientListener, boolean diagnostics){
queue = aQueue;
addToQueue(this);
client = aSocket;
clientRef = aClientListener;
aDiagnostic = diagnostics;
} // end constructor ClientWorker
* run method is the main loop of the server program
* in change of handle new client connection as well
* as handle all messages and errors.
public void run(){
boolean alive = true;
String aSubString = "";
in = null;
out = null;
loginName = "";
loggedIn = false;
while (alive && client.isConnected()&& clientRef.hostSocket.isConnected()){
try{
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
if(aDiagnostic){
out.println("WELCOME to diagnostics");
broadCastDia("Connect : diagnostics "+client.getInetAddress().toString());
out.flush();
else {
out.println("WELCOME to Troy's Server");
broadCastDia("Connect : client "+client.getInetAddress().toString());
out.flush();
String line;
while(((line = in.readLine())!= null)){
StringTokenizer aStringToken = new StringTokenizer(line, " ");
if(!aDiagnostic){
broadCastDia(line);
clientRef.sendMessage(line); // send mesage out to netExpress
out.println(line);
out.flush();
else{
if(line.equals("GETIPS"))
getIPs();
else{
clientRef.sendMessage(line); // send mesage out to netExpress
out.println(line);
out.flush();
} // end while
catch(Exception e){
// System.out.println("ERROR:Client Connection reset");
JOptionPane.showMessageDialog(null, (e.toString()),"ERROR:Client Connection reset", JOptionPane.ERROR_MESSAGE);
try{
if(aDiagnostic){
broadCastDia("Disconnect : diagnostics "+client.getInetAddress().toString());
out.flush();
else {
broadCastDia("Disconnect : client "+client.getInetAddress().toString());
out.flush();
// close the buffers and connection;
in.close();
out.close();
client.close();
// System.out.println("out");
// remove from list
removeThreadQueue(this);
alive = false;
catch(Exception e){
// System.out.println("ERROR: Client Connection reset failure");
JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Client Connection reset failure", JOptionPane.ERROR_MESSAGE);
}// end while
} // end method run
* method run - Generates io stream for communicating with the server and
* starts the client gui. Run also parses the input commands from the server.
public void run(){
boolean alive = true;
try{
// begin to life the gui
// aGuiClient = new ClientGui(hostName.getHostName(), hostPort, loginName, this);
// aGuiClient.show();
in = new BufferedReader(new InputStreamReader(hostSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(hostSocket.getOutputStream()));
while (alive && hostSocket.isConnected()){
String line;
while(((line = in.readLine())!= null)){
System.out.println(line);
broadCast(line);
} // end while
} // end while
catch(Exception e){
// System.out.println("ERRORa Connection to host reset");
JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Connection to nPort reset", JOptionPane.ERROR_MESSAGE);
try{
hostSocket.close();
}catch(Exception a){
JOptionPane.showMessageDialog(null, (a.toString()),"ERROR: Exception", JOptionPane.ERROR_MESSAGE);
alive = false;
System.exit(1);
} // end method run -
Problem with threads and camera.
Hi everybody!
I've a problem with taking snapshot.
I would like to display a loading screen after it take snapshot ( sometimes i
have to wait few seconds after i took snapshot. Propably photo is being taken in time where i have to wait).
I was trying to use threads but i didn't succeed.
I made this code:
display.setCurrent(perform);
new Thread(new Runnable(){
public void run() {
while((!performing.isShown()) && (backgroundCamera.isShown())){
Thread.yield();
notifyAll();
}).start();
new Thread(new Runnable(){
public void run() {
try {
this.wait();
} catch(Exception e) {
exceptionHandler(e);
photo = camera.snapshot();
display.setCurrent(displayPhoto);
}).start();This code is sometimes showing performing screen but sometimes no.
I don't know why. In my opinion performing.isShown() method isn't working correctly.
Does anyone have some idea how to use threads here?Hi,
I've finally managed to work this fine.
The code:
Object o = new Object();
display.setCurrent(perform);
new Thread(new Runnable(){
public void run() {
while(!performing.isShown()){
Thread.yield();
synchronized(o) {
o.notify();
}).start();
new Thread(new Runnable(){
public void run() {
try {
synchronized(o) {
o.wait(1);
} catch(Exception e) {
exceptionHandler(e);
photo = camera.snapshot();
display.setCurrent(displayPhoto);
}).start(); -
We have a problem where our application stops responding after a few days of usage. Things will for fine for a day or two, and then pretty quickly threads will start getting hung up, usually in places where they are allocating memory
We are running WebLogic 8.1 SP2 on Sun JDK 1.4.2_04 on Solaris 8 using the alternate threading model and the -server hotspot vm. We are running pretty much the same code that we had no problems with under WebLogic 6.1 SP4 and Sun JDK 1.3.1.
A thread dump usually shows that some or all of our execute threads are in the state "waiting for monitor entry" even though they are not currently waiting on any java locks. Here is a sample thread from the thread dump (we have ~120 threads so I don't want to post the full dump).
=============================================================================================
"ExecuteThread: '8' for queue: 'itgCrmWarExecutionQueue'" daemon prio=5 tid=0x005941d0 nid=0x2c waiting for monitor entry [c807f000..c807fc28]
at java.lang.String.substring(String.java:1446)
at java.lang.String.substring(String.java:1411)
at weblogic.servlet.internal.ServletRequestImpl.getRelativeUri(ServletRequestImpl.java:1872)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3492)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2585)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
=============================================================================================
String.java line 1446 for this jdk allocates a new String object, and all the other threads in this state also are creating new objects or arrays, etc.
We've done a pstack on this process when it's in this state, and the threads that are in the "waiting for monitor entry" that look like they're allocating memory are all waiting on the same lwp_mutex_lock with some allocation method that's calling into the native TwoGenerationCollectorPolicy.mem_allocate_work (see pstack output below for the same thread as in the thread dump above)
=============================================================================================
----------------- lwp# 44 / thread# 44 --------------------
ff31f364 lwp_mutex_lock (e3d70)
fee92384 __1cNObjectMonitorGenter26MpnGThread__v_ (5000, 525c, 5000, 50dc, 4800, 4af0) + 2d8
fee324d4 __1cSObjectSynchronizerKfast_enter6FnGHandle_pnJBasicLock_pnGThread__v_ (c807f65c, c807f7d4, 5941d0, 0, 35d654, fee328ec) + 68
fee32954 __1cQinstanceRefKlassZacquire_pending_list_lock6FpnJBasicLock__v_ (c807f7d4, ff170000, d4680000, 4491d4, fee1bc2c,
0) + 78
fee3167c __1cPVM_GC_OperationNdoit_prologue6M_i_ (c807f7bc, 4400, ff170000, 2d2b8, 4a6268, c807fa18) + 38
fee2e0b0 __1cIVMThreadHexecute6FpnMVM_Operation__v_ (c807f7bc, 963a8, 0, 0, 1, 0) + 90
fed2c2a4 __1cbCTwoGenerationCollectorPolicyRmem_allocate_work6MIii_pnIHeapWord__ (962c0, ff1c29ec, ff1c297c, ff131a26, 4800, 4998) + 160
fed22940 __1cNinstanceKlassRallocate_instance6MpnGThread__pnPinstanceOopDesc__ (ee009020, 5941d0, 15ca581, 3647f0, 4a6268, c807f8c8) + 180
fed34928 __1cLOptoRuntimeFnew_C6FpnMklassOopDesc_pnKJavaThread__v_ (ee009018, 5941d0, 0, 0, 0, 0) + 28
fa435a58 ???????? (ee009018, e86de, 15ca4de, 50dc, 5941d0, c807f9c8)
fb36f9a4 ???????? (0, d412ccd8, ee046c28, ff170000, 0, 0)
fad8b278 ???????? (ee046c28, d6000c90, ee046530, 8, db8e8450, c807f9e8)
fad62abc ???????? (d412ccd8, ee046530, d6000c90, ee3bfa38, 8, c807fa18)
fa4b3c38 ???????? (c807fb9c, 0, f2134700, fa415e50, 8, c807faa8)
fa40010c ???????? (c807fc28, c807fe90, a, ee9e1e20, 4, c807fb40)
fed5d48c __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_ (c807fe88, c807fcf0, c807fda8, 5941d0, 5941d0, c807fd00) + 27c
fee4b784 __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_ (ff170000, 594778, c807fd9c, c807fd98, c807fda8, 5941d0) + 164
fee5e8dc __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_ (c807fe88, c807fe84, c807fe7c, c807fe74, c807fe6c, 5941d0) + 6c
fee6fc74 __1cMthread_entry6FpnKJavaThread_pnGThread__v_ (5941d0, 5941d0, 838588, 594778, 306d10, fee69254) + 128
fee6927c __1cKJavaThreadDrun6M_v_ (5941d0, 2c, 40, 0, 40, 0) + 284
fee6575c _start (5941d0, fa1a1600, 0, 0, 0, 0) + 134
ff3758c0 lwpstart (0, 0, 0, 0, 0, 0)
=============================================================================================
Also when it's having this problem, the "VM Thread" is always using a lot of processor time. We did a couple of pstacks today while it was having this problem, and this thread was stuck in the ONMethodSweeper.sweep for over 15 minutes when we finally killed the server.
From the thread dump:
"VM Thread" prio=5 tid=0x000e2d20 nid=0x2 runnable
From the first pstack:
=============================================================================================
----------------- lwp# 2 / thread# 2 --------------------
fed40c04 __1cXvirtual_call_RelocationIparse_ic6FrpnICodeBlob_rpC5rppnHoopDesc_pi_nNRelocIterator__ (42a2f4, fa5fa46d, ffffffff, fc4ffcb8, 42a2f4, 42a324) + 124
fed46318 __1cKCompiledIC2t5B6MpnKRelocation__v_ (42a2f0, fc4ffd24, fc4ffd4c, e802, 0, 6) + 38
fed90c38 __1cHnmethodVcleanup_inline_caches6M_v_ (fa5f7f88, fa608940, 1, 0, fa400000, 6) + 1ac
fede18b4 __1cONMethodSweeperFsweep6F_v_ (2cf38, 0, ffffffff, ff1cf1fc, ff1c66e8, fede1d44) + 1b0
fede1e6c __1cUSafepointSynchronizeFbegin6F_v_ (2cf38, ff1ba138, 5000, 50dc, 5000, 525c) + 248
feef1fd4 __1cIVMThreadEloop6M_v_ (4400, 4000, 4324, 4000, 42b0, 3800) + 3d4
feef1ae4 __1cIVMThreadDrun6M_v_ (e2d20, 2, 40, 0, 40, 0) + 8c
fee6575c _start (e2d20, ff270200, 0, 0, 0, 0) + 134
ff3758c0 lwpstart (0, 0, 0, 0, 0, 0)
=============================================================================================
Second pstack
=============================================================================================
----------------- lwp# 2 / thread# 2 --------------------
fed41180 __1cXvirtual_call_RelocationIparse_ic6FrpnICodeBlob_rpC5rppnHoopDesc_pi_nNRelocIterator__ (0, ff1b9664, ffffffff, fc4ffcb8, a6f2cc, fc4ffbd0) + 6a0
fed46318 __1cKCompiledIC2t5B6MpnKRelocation__v_ (a6f2c8, fc4ffd24, fc4ffd4c, e802, 0, 6) + 38
fed90c38 __1cHnmethodVcleanup_inline_caches6M_v_ (faded4c8, fadf2c80, 1, 0, fa400000, 6) + 1ac
fede18b4 __1cONMethodSweeperFsweep6F_v_ (2cf38, 0, ffffffff, ff1cf1fc, ff1c66e8, fede1d44) + 1b0
fede1e6c __1cUSafepointSynchronizeFbegin6F_v_ (2cf38, ff1ba138, 5000, 50dc, 5000, 525c) + 248
feef1fd4 __1cIVMThreadEloop6M_v_ (4400, 4000, 4324, 4000, 42b0, 3800) + 3d4
feef1ae4 __1cIVMThreadDrun6M_v_ (e2d20, 2, 40, 0, 40, 0) + 8c
fee6575c _start (e2d20, ff270200, 0, 0, 0, 0) + 134
ff3758c0 lwpstart (0, 0, 0, 0, 0, 0)
=============================================================================================
Has anyone ever seen anything like this? I'm trying to figure out if this is caused by something we're doing, or something relating to our environment and jvm options. Any ideas?Thanks for the reply - I'm testing our app with the +UseConcMarkSweepGC now in our test environment to make sure it doesn't cause any problems there. Unfortunately the only place we've had this problem is on the production server, so it's extra difficult debugging this.
We're using the following memory options:
-ms512m -mx512m -XX:NewSize=128m -XX:PermSize=192m -XX:MaxNewSize=128m -XX:MaxPermSize=192m -XX:SurvivorRatio=8and the following debugging options, as we've also been seeing OutOfMemoryErrors ( see http://forum.java.sun.com/thread.jsp?forum=37&thread=522354&tstart=45&trange=15 )
-verbosegc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGCBTW, which c++filt version and options are you using? Our Solaris boxes only seem to have the GNU version installed. I was trying to run that on some of the other stack traces and wasn't getting anywhere, and didn't know if because it was GNU version wouldn't work on something compiled with the Sun compiler.
Thanks!
--Andy -
Problem with threads and ProgressMonitor
Dear Friends:
I have a little problem with a thread and a ProgressMonitor. I have a long time process that runs in a thread (the thread is in an separate class). The thread has a ProgressMonitor that works fine and shows the tasks progress.
But I need deactivate the main class(the main class is the user interface) until the thread ends.
I use something like this:
LongTask myTask=new LongTask();
myTask.start();
myTask.join();
Now, the main class waits for the task to end, but the progress monitor don`t works fine: it shows only the dialog but not the progress bar.
What's wrong?Is the dialog a modal dialog? This can block other UI updates.
In general, you should make sure that it isn't modal, and that your workThread has a fairly low priority so that the UI can do its updating
Maybe you are looking for
-
How do I find my old iPhoto Library? It disappeared.
Hello, iPhoto was frozen for a few days (it wouldn't move past the grey, loading screen). I forced it to a quit a couple times to no avail. I finally updated my software from the Apple drop down box and the computer restarted. After it restarted,
-
Upgraded to 10.4.9 - iSync no longer works with RAZR V3c (screenshots)
iSync has been working great with my RAZR V3c. I've been using it for my Address Book and iCal. Upgraded to 10.4.9 and now it doesn't recognize any devices to sync to, which is odd. I can still browse the phone using Bluetooth File Exchange. And as y
-
Live cueing of accompanying audio tracks?
Hi, I need to cue the orchestral audio tracks which will accompany live performances (from the piano) of my piano concerto. I want to use a footswitch to 'bring the orchestra in' and then have Logic stop automatically at the end of each passage & awa
-
Writing specialized metadata to image using Javascript...
I'm working on a project where we are dumping metadata from a database into a text file and then writing it to images using javascript. As long as I use the fields listed in the Javascript reference manual, it works perfectly. However, the client has
-
Show Hidden Windows files on a Mac
Hi, I have a folder that I have copied from Windows XP to Mac. The files in the folder were hidden when I copied on the mac. I can see the folder but cannot see the files in the folder. How do I see these files on my mac? It is frustrating as I have