Problem mit Thread

Status
Nicht offen für weitere Antworten.

spike78

Bekanntes Mitglied
Hallo zusammen,

ich habe folgendes Problem. Ich verwende einen Thread um Daten in ein bel. Verzeichnis zu kopieren. Gleichzeitig wird ein "Warten-Dialog" angezeigt. Das Problem ist nur, dass wenn ich sehr kleine Dateien kopiere (1Kb), geht dieser "Warte-Dialog" nicht mehr weg. Die Datei ist aber kopiert worden.

Hier noch etwas Code:

Code:
public class OCopyTestDataThread  extends Thread  implements OIGuiResource
{
    private File m_filein,m_fileout;
    private ODialog m_dialog;

    public OCopyTestDataThread(ODialog dia, File in, File out)
    {
        super(m_Resource.getString("OCopyTestDataThread.TTL"));
        m_dialog = dia;
        m_filein=in;
        m_fileout=out;
    }

    public void run() {
        BufferedReader in = null;
        int i;
        try {
            in = new BufferedReader(new FileReader(m_filein));
            BufferedWriter out = null;
            out = new BufferedWriter(new FileWriter(m_fileout));

            while ((i = in.read()) != -1)
                out.write(i);
            in.close();
            out.close();
            interrupt();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
         m_dialog.setVisible(false);
    }

Danke und Gruß

Michael
 
Hi,

das mache ich.

Code:
 JPanel pan = new JPanel();
        pan.add(new JLabel(new ImageIcon(Helper.loadImage(IMAGEPATH + "files_upload_anim.gif"))));
        ODialog dialog = new ODialog(250, 75, m_Mainpanel.getParentFrame());
        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        dialog.setTitle(m_Resource.getString("OCopyTestDataThread.STR"));
        dialog.setModal(true);
        dialog.add(pan);

        m_Mainpanel.showWaitCursor(true);
        OCopyTestDataThread thread = new OCopyTestDataThread(dialog, m_filein, m_fileout);
        dialog.setVisible(true);
        thread.start();
        dialog.setVisible(false);

Gruß
 
Spuckt er dir vllt. irgendeinen Fehlermeldung aus? Zeigt er dir etwas an?
Poste vllt. mal etwas mehr Quelltext, dass man es mal selber testen kann.
 
Hi,

nein eine Fehlermeldung bekomme ich nicht. Hier noch die Dialog Klasse.

Code:
public class ODialog extends JDialog implements OIMaxValueSize
{
    public ODialog(Frame owner, boolean bModal)
    {
        super(owner, bModal);
        this.centerScreen();
        setResizable(false);
    }

    public ODialog(Dialog owner, boolean bModal)
    {
        super(owner, bModal);
        this.centerScreen();
        setResizable(false);
    }

    public ODialog(int width, int height)
    {
        setSize(width, height);
        this.centerScreen();
        setResizable(false);
        setModal(true);
    }

    public ODialog(int width, int height, Frame owner)
    {
        super(owner);
        setSize(width, height);
        this.centerScreen();
        setResizable(false);
        setModal(true);
    }

    /**
     * <code>centerScreen</code> zentriert den Dialog auf dem Bildschirm.
     */
    public void centerScreen() {
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setLocation( (screenSize.width - getWidth())/2, (screenSize.height - getHeight())/2 );
    }
}
 
> dialog.setVisible(true);
> thread.start();
> dialog.setVisible(false);

wieso wird der dialog gleich wieder auf setVisible(false) gesetzt, welcher Zweck?

hilft ein Thread.sleep(300) oder ähnliches am Anfang und/ oder Ende des Threads, um dem Dialog Zeit zu geben, sich anzuzeigen?

wie wärs mit einem Thread am Ende des Threads,
der den Dialog auf setVisible(false); setzt, 200ms schläft und das ganze so lange wiederholt, bis der Dialog endlich nicht mehr zu sehen ist?

(unter der Annahme dass es nur an zu schneller Befehlsfolge liegt)
 
Hi,

damit geht es auch nicht.

Code:
public class OCopyTestDataThread extends Thread implements OIGuiResource
{
    private File m_filein, m_fileout;
    private ODialog m_dialog;

    public OCopyTestDataThread(ODialog dia, File in, File out)
    {
        super(m_Resource.getString("OCopyTestDataThread.TTL"));
        m_dialog = dia;
        m_filein = in;
        m_fileout = out;
    }

    public void run()
    {
        BufferedReader in = null;
        int i;
        try {
            in = new BufferedReader(new FileReader(m_filein));
            BufferedWriter out = null;
            out = new BufferedWriter(new FileWriter(m_fileout));

            while ((i = in.read()) != -1) {
                out.write(i);
            }
            in.close();
            out.close();

        }
        catch (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        new closeDialogThread();

    
        interrupt();

    }

    private class closeDialogThread extends Thread{

        public closeDialogThread(){
            start();
        }
        public void run(){
            while(m_dialog.isShowing()){
                m_dialog.setVisible(false);
                try {
                    wait(200);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
            interrupt();
        }
    }
}

Bekomme hier diesen Fehler:

Exception in thread "Thread-3" java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at com.idsscheer.osiris.gui.misc.threads.OCopyTestDataThread$closeDialogThread.run(OCopyTestDataThread.java:69)
Warning: classic VM not supported; client VM will be used
 
wait hat damit nix zu tun,

Thread.sleep(300) wie geschrieben

--------

poste bitte nciht in ein öffentliches Forum
//To change body of catch statement use File | Settings | File Templates.
oder ähnliches 😉
ist doch nicht so schwer zu entfernen
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben