Ablauf abbrechen und zurück

Status
Nicht offen für weitere Antworten.
L

Louis2

Gast
Hallo,

mein Prog. verschickt Emails, der Status wird in eine JProgressBar angezeigt.
Nun habe ich auch ein Button eingefügt zum abbrechen, wie kann ich den Vorgang (das Versenden) abbrechen und an die Stelle vor dem Versenden zurückkehren?
[EDIT]Mit dem break geht es nicht so ganz und ich komme ja nicht zurück!

Code
Code:
if (main.LogSchalter.equals("NO") | main.LogSchalter.equals("No") 
| main.LogSchalter.equals("no"))
{
    if (action == sendButton) 
    {
        .
        .
        .         
        Runnable r = new Runnable()
        {
            public void run()
            {
                cancelButton.setEnabled(true);
                for ( int i = 1; i <= len; i++ )
                {
                    try
                    {
                        Transport.send(msg);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                    final int j=i;
                                    
                    SwingUtilities.invokeLater( new Runnable()
                    {
                        public void run()
                        {
                            bar.setValue(j);
                            valueProg.setText((j) + " of " + len + " Emails");
	        }
                    } );
                    if (action == cancelButton)
                    break; 
// hier soll das Versenden abgebrochen werden und vor 
// if (action == sendButton) zurückkehren.
                }
            }
        };
Thread t = new Thread(r);
t.start();
    }
}
 
R

Roar

Gast
ähm indem du einfach auf irgendne boolean variable überprüfst die gesetzt wird wenn ma nabbrechen drückt??
btw 1. es gibt auch ein equalsIgnoreCase() ...
und 2. wenn die methode da im actionListener steht, dann soltle schon der ganze tread mit invokeLater() ausgeführt werden..
 
L

Louis2

Gast
Das mit dem "Abbruch" Button habe ich ja schon reingepackt, siehe Code oben, aber mit dem break; stoppt das Programm nur während das Button gedrückt ist, ich will aber, das der aktuelle Vorgang ganz abgebrochen wird...
Bei Threads geht es ja mit stop() und hier? :roll:
 
L

Louis2

Gast
Also mit stop() will es auch nicht... ähm... hat keiner eine Ahnung wie ich den Code einfach abbrechen kann, bzw. den runnable Ablauf?
Sollte doch irgendwie gehen, das Button habe ich ja schon...
 
L

Louis2

Gast
@Roar: Jetzt verstehe ich erst was Du meinst.
Also ich habe mein Code geändert und zwar in
Code:
boolean state = true;
.
.

if (state == true)
{
        if (main.LogSchalter.equals("NO") | main.LogSchalter.equals("No") 
| main.LogSchalter.equals("no"))
        {
            if (action == sendButton) 
            { 
.
.
                try
                {
.
.
                            Runnable r = new Runnable()
                            {
                                public void run()
                                {
                                    cancelButton.setEnabled(true);
                                    try
                                    {
                                        Transport.send(msg);
                                    }
                                    catch (Exception e4)
                                    {
                                        JOptionPane.showMessageDialog(null, 
"Error during transport:" + "\n" + e4.getMessage());
                                    }
                                    j=k;
                                    
                                    SwingUtilities.invokeLater( new Runnable()
                                    {
                                        public void run()
                                        {
                                            bar.setValue(j);
                                            valueProg.setText((j) + " of " + 
leng + " Emails");
                                        }
                                    } );
                                    /*if (action == cancelButton) 
                                        state = false;*/
                                }
                            };
                            Thread t = new Thread(r);
                            t.start();
                                                                                                               
                            main.message.setText("");
                            main.subjectField.setText("");
                            if (action == cancelButton) // Abbruch Button
                               state = false;
.
                }
                catch (Exception e6)
                {
                    JOptionPane.showMessageDialog(null, "Error: Could not create file"); 
                }
            }
        }
     }

Aber es funktioniert immer noch nicht. Wo soll ich denn das
Code:
if (action == cancelButton) // Abbruch Button
                               state = false;
richtig positionieren? Im Runnable?
 
L

Louis2

Gast
Dieses Problem besteht immer noch, habe verschiedene Varianten mit dem boolean probiert aber das Versenden bzw. der Fortschrittsbalken wird nicht angehalten.

Hmm noch Vorschläge?
 
L

Louis2

Gast
Das Problem besteht weiterhin. Ich verstehe es einfach nicht, das Versenden wird nie abgebrochen. Bin ich zu dumm oder ist die Lösung doch nicht so einfach wie ich es mir erhofft habe? ???:L
Wo ist mein fehler?

Code:
public void stop() 
{ 
    state = false;
}
    
public void start()
{
    t = new Thread(new Runnable()
    {
        public void run()
        {
            cancelButton.setEnabled(true);
            state = true;
            while (state)
            {
                try
                {
                    Transport.send(msg);
                }
                catch (Exception e4)
                {
                    JOptionPane.showMessageDialog(null, "Error during transport:" + "\n" + e4.getMessage(), "Message", JOptionPane.ERROR_MESSAGE);
                }
                j=k;
                                    
                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        bar.setValue(j);
                        valueProg.setText((j) + " of " + leng + " Emails");
                    }
                });
                if (action == cancelButton) // hier sollte er abbrechen/stoppen oder?
                    stop();
            }
        } 
    });
    t.start();
}
 

Mag1c

Top Contributor
Hi,

wie sieht denn dein ActionListener aus ? Hast du einen gemeinsamen für Start/Stop ? Das if (action == cancelButton) muß jedenfalls in den ActionListener.

Gruß
Mag1c
 

Bleiglanz

Gesperrter Benutzer
stop nicht verwenden

wenn dann interrupt für den Thread aufrufen, und zwar in der actionPerformed Methode des buttens

aber dazu musst du erstmal die anonyme innere klasse rausschmeissen, sonst hast du überhaupt keine Chance dem Thread was mitzuteilen (du willst ja den invokeLater anhalten, nicht den aussenrum)??

und wozu hast du eigentlich ZWEI Threads im einsatz?
 
L

Louis2

Gast
Zur Übersicht... so sieht das ganze aus (mit paar Änderungen), also
@Mag1c:
Code:
if (e.getSource() == cancelButton)
ist also im ActionListener drin, oder ???:L
@Bleiglanz: Statt stop() habe ich jetzt t.isInterrupted() genommen, das 2te
Code:
public void run()
habe ich rausgehauen. Maisl werden versendet, dazu habe ich ein Forschrittsbalken, welches in
Code:
  SwingUtilities.invokeLater(new Runnable()
aktualisiert wird. Bei abbrechen, muss natürlich der Balken stehen bleiben (da ich später Wiederaufsetzen implementieren möchte) aberder Versand der mails muss natürlich
auch abgebrochen werden (bzw. eingeschläfert) werden.
Was mache ich noch falsch?

Code:
.
.
public void actionPerformed(ActionEvent e) 
{
    .
    .
    validMailAddressSender(erg);
    .
}

boolean validMailAddressSender(String mailAddress) 
{
    .
    .
    writeMail_Log();
    .
}

public void writeMail_Log() 
{
    .
    .
    sendMail_Log();
    .
}

public void sendMail_Log() 
{
    .
    .
    start();
    .
}

public void start() 
{ 
    t = new Thread(new Runnable() 
    { 
        public void run() 
        { 
            cancelButton.setEnabled(true); 
            state = true; 
            while (state) 
            { 
                try 
                { 
                    Transport.send(msg); 
                } 
                catch (Exception e4) 
                { 
                    JOptionPane.showMessageDialog(null, "Error during transport:" + "\n" + 
e4.getMessage(), "Message", JOptionPane.ERROR_MESSAGE); 
                } 
                j=k; 
                                    
                SwingUtilities.invokeLater(new Runnable() 
                { 
                    bar.setValue(j); 
                    valueProg.setText((j) + " of " + leng + " Emails"); 
                }); 
                if (e.getSource() == cancelButton) // hier sollte er abbrechen/stoppen oder? 
                    t.isInterrupted();
            } 
        } 
    }); 
    t.start(); 
}
 

Mag1c

Top Contributor
Hi,

oh, da hab ich mich wohl nicht so klar ausgedrückt. Also zeig mal bitte die ganze actionPerformed(...). Da muß nämlich auch das "if (e.getSource() == cancelButton)" rein. Das mit dem stop() war wohl ein Missverständnis. Du solltest deine eigenen Methoden nicht start() und stop() nennen (sondern z.B. startSendMail() und stopSendMail()).

Gruß
Mag1c
 
L

Louis2

Gast
@Mag1c: Nabend ;),
also wie du oben im Beispiel sehen kannst, gibt es die actionPerformed() Methode und dadrin sind die anderen sozusagen "gekapselt".
Wie gesagt abgebrochen muss das "Senden" (Transfer.send(msg)) und Fortschrittsbalken (in SwingUtilities.invokeLater).

Die actionPerformed() wie gewünscht: (muss ich "if (e.getSource() == cancelButton)" nach dem Methode Aufruf reinpacken??)
Code:
public void actionPerformed(ActionEvent e) 
{
    selectedColumns = table.getSelectedColumns();
    leng = table.getRowCount();
    action=e.getSource();
                           
    if ((main.LogSchalter.equals("NO") | main.LogSchalter.equals("No") | 
main.LogSchalter.equals("no")) && (main.DataAttached.equals("NO") | 
main.DataAttached.equals("No") | main.DataAttached.equals("no") | 
main.DataAttached.equals("") | main.DataAttached.equals("YES") | 
main.DataAttached.equals("Yes") | main.DataAttached.equals("yes")))
    {
        if (action == sendButton) 
        { 
            number = 0;
            check = 0;
            check1 = 0;
            check2 = 0;
            check3 = 0;
            check4 = 0;
            for (i=0;i<leng;i++)
            {
                String erg = (String) table.getModel().getValueAt(i, 2);
                if (erg == null)
                    number++;
                else
                    validMailAddressRecipient(erg); // Methode wird aufgerufen
            }
            if (number>0)
                JOptionPane.showMessageDialog(null, "No recipient address in one or more record(s) available, please check!", "Message", 
JOptionPane.INFORMATION_MESSAGE); 
            else if (check>0 || check1>0 || check2>0 || check3>0 || check4>0)
                JOptionPane.showMessageDialog(null, "One or more recipient address(es) do(es) not have the right syntax, please check!", 
"Message", JOptionPane.INFORMATION_MESSAGE);
            else if (main.INIEmailFrom.equals(""))
                JOptionPane.showMessageDialog(null, "No sender registered, please check!", 
"Message", JOptionPane.INFORMATION_MESSAGE);
            else
            {
                validMailAddressSender(main.INIEmailFrom); // Methode wird aufgerufen
            }
        }
    }
    else
    {
        if (e.getSource() == sendButton) 
       {
           JOptionPane.showMessageDialog(null, "Illegal input in .ini (LogOnly OR FileAttached), please check!", "Message", 
JOptionPane.INFORMATION_MESSAGE); 
        }  
    }
}
 

Mag1c

Top Contributor
Hi,

vom Prinzip her funktioniert das mit dem cancelButton genauso wie mit dem sendButton. D.h. wenn der cancelButton enabled wurde und du da drauf geklickt hast, wird ganz genauso die actionPerformed(...)-Methode aufgerufen. Du solltest auch in der actionPerformed(...) zuerst die Quelle selektieren (es sei denn, du willst bestimmte Bedingungen für alle Events gleich prüfen). Hier also mal ein paar Code-Schnipsel, die dich hoffentlich etwas weiterbringen:

Code:
public void actionPerformed(ActionEvent e) 
{ 
    selectedColumns = table.getSelectedColumns(); 
    leng = table.getRowCount(); 
    action=e.getSource();

    if (action == sendButton)
    {
        if ((main.LogSchalter ...

    }
    else if (action == cancelButton)
    {
        stopSendingMail();
    }
}


public void stopSendingMail ()
{
    state = false;
}

Und noch ein Tip: main.LogSchalter.equalsIgnoreCase("no")

Gruß
Mag1c
 
L

Louis2

Gast
Hallo,

funktioniert immer noch nicht, irgendwo ist der Wurm drin. Irgendwie wird die Aktion des Buttons nicht in der richtigen Methode aufgerufen/ausgeführt.
Die "state" Überprüfung erfolgt in der writeMail_Log() Methode die irgendwann die sendMail_Log() aufruft.
Bei der writeMail_Log() wird in eine Log Datei geschrieben, aber wenn dort die Überprüfung vorgenommen wird, sollte er beim Klick des Buttons auch abbrechen, nichts passiert ;-) Eine Ahnung? (Die ganze Klasse zu posten ist ein bisschen zu lang, kann sie auch schicken wenn Bedarf ist).

Meine actionPerformed:
Code:
public void actionPerformed(ActionEvent e) 
{
    selectedColumns = table.getSelectedColumns();
    leng = table.getRowCount();
    action=e.getSource();
                           
        if ((main.LogSchalter.equalsIgnoreCase("no")) && (main.DataAttached.equalsIgnoreCase("no") | main.DataAttached.equals("") | main.DataAttached.equalsIgnoreCase("yes")))
        {
            if (action == sendButton) 
            { 
                .
                if (number>0)
                .
                else
                {
                    validMailAddressSender(main.INIEmailFrom);
                }            
            }
            if (action == cancelButton)
            {
                stopSendingMail();
            }
        }
        else if ((main.LogSchalter.equalsIgnoreCase("yes") | main.LogSchalter.equals("")) && (main.DataAttached.equalsIgnoreCase("no") | main.DataAttached.equals("") | main.DataAttached.equalsIgnoreCase("yes"))) 
        {
            if (action == sendButton) 
            { 
                .
                if (number>0)
                .    
                else
                {
                    validMailAddressSender(main.INIEmailFrom);
                }
            }
            if (action == cancelButton)
            {
                stopSendingMail();
            }
        }
}

Die stopSendingMail():
Code:
public void stopSendingMail() 
{ 
    state = false; 
    t.isInterrupted();
}

Die validMailAddressSender():
Code:
boolean validMailAddressSender(String mailAddress) 
{ 
    .
    if (question == JOptionPane.YES_OPTION)
    {
        if ((main.LogSchalter.equalsIgnoreCase("yes") | main.LogSchalter.equals("")) && (main.DataAttached.equalsIgnoreCase("no") | main.DataAttached.equals("") | main.DataAttached.equalsIgnoreCase("yes"))) 
                    writeLog();
        else if ((main.LogSchalter.equalsIgnoreCase("no")) && (main.DataAttached.equalsIgnoreCase("no") | main.DataAttached.equals("") | main.DataAttached.equalsIgnoreCase("yes")))
                    writeMail_Log();
     }
     return retValue;
}

Die writeMail_Log():
Code:
public void writeMail_Log() // Write in Email body and log
{
    .
    if (ret == JOptionPane.YES_OPTION) 
    {
        sendButton.setEnabled(true);
        cancelButton.setEnabled(false);            
        try
        {
            dateiStream = new FileWriter(logname); 
            ausgabe = new PrintWriter(dateiStream);
            dateiStream1 = new FileWriter(filename); 
            csvdata = new PrintWriter(dateiStream1);
                
            while (state == true)
            {
                cancelButton.setEnabled(true);
                sendButton.setEnabled(false);
                    
                for (k=0; k<leng; k++)
                {
                    try
                    {
                        .
                        for (int y=0; y<=selectedColumns.length-1;y++)
                        {
                            .
                        }                            
                        sendMail_Log();
                    }
                    catch (Exception e6)
                    {
                        . 
                    }
                    main.setVisible(false);
                }
                ausgabe.close();
                state = false;
            }
        }    
        catch (Exception e7)
        {
            . 
        }
    }

Die sendMail_Log():
Code:
public void sendMail_Log() // Send Email and log
{
   .
   .
   //Runnable r = new Runnable()
   t = new Thread(new Runnable() 
   {
       public void run()
       {
           try
           {
               Transport.send(msg);
           }
           catch (Exception e4)
           {
               .
           }
           j=k;
                                    
           SwingUtilities.invokeLater(new Runnable()
           {
               public void run()
               {
                   bar.setValue(j);
                   valueProg.setText((j) + " of " + leng + " Emails");
               }
           });
        }
   });
   //};
   //Thread t = new Thread(r);
   t.start();
}
 

Mag1c

Top Contributor
Hi,

na so langsam kommen wir der Sache doch näher ;) Das t.isInterrupted() im stopSendingMail() kannst du weglassen.
Bei dem Rest hat sich der Code irgendwie seit dem Anfang verändert. Du hast jetzt die for-Schleife außerhalb der/des Threads. Damit erzeugst du für jede zu verschickende Mail einen neuen Thread. Das wolltest du so bestimmt nicht, oder?

(Falls du kein Problem damit hast, kannst du mir die Klasse auch mal per Mail schicken an Mag1c (at) gmx (dot) de
das würde die Lösungsfindung erheblich beschleunigen)

Gruß
Mag1c
 

Mag1c

Top Contributor
Hi,

so, hab das nun mal kurz überflogen und im Prinzip ist auch klar, was da passieren soll :)

da ich gerade nicht soo viel Zeit habe, deinen Code umzubauen, versuche ich mal kurz den Ablauf darzustellen:

Code:
public void actionPerformed(ActionEvent e) {
    action=e.getSource();

    if (action == sendButton) {
        // Hier alles für den Send-Button rein
    }
    else if (action == cancelButton) {
        stopSendingMail();
    }
}

public void stopSendingMail() { 
    state = false; 
}

public void writeMail_Log () {
    ...
    cancelButton.setEnabled(true);
    t = new Thread(new Runnable() 
    {
        public void run() {
            for (k=0; k < leng && state == true; k++) {
                ...
                // Mail senden
                // und Scrollbalken aktualisieren
            }
        }
    }

D.h. du erzeugst EINEN Thread der nacheinander ALLE Mails rausschickt. In der Hauptschleife des Threads (for k=0...) wird auch die Abbruchbedingung (state == true) geprüft. D.h. drückst du auf den cancelButton, wird das Flag auf false gesetzt. Wenn der Thread mit dem senden der aktuellen Mail fertig ist, bricht er den weitern Mail-Versand ab.

Gruß
Mag1c
 
L

Louis2

Gast
Hallo,

also das mit dem Abbruch funktioniert schonmal, auch die JProgressBar wird gestoppt. Aber:
1. Die Excel-Datei die auch produziert wird, wird nicht mehr aktualisiert sondern beinhaltet immer den Wert der ersten mail (Vorgang unter writeMail_Log()). Ist aber seltsam ich schliesse ja die csv.Datei nach jedem Durchgang (Zeile 52) Dass der Name der Datei immer gleich ist, sollte doch auch kein Problem sein oder kann er doch die alte nicht überschreiben??
2. Nun möchte ich das Wiederaufsetzen implementieren. Heißt wenn abgebrochen bekommt das Button die Schrift "Wiederaufsetzen", beim Knopfdruck wechselt der Status wieder auf true und sollte weitergemacht werden. D.h im Klartext wie kann ich zu 100% wissen wo der Sendevorgang abgebrochen wurde. Die einfachste Variante wäre die Zahl bei der JProgressBar zu nehmen und in eine For-Schleife von dort bis zum Ende das ganze Sende-Vorgang weiterzumachen. Gibt es ne andere einfachere Lösung?
Code:
public void writeMail_Log() // Write in Email body and log
{
        final String ans = JOptionPane.showInputDialog(this, "Email subject title", "Email subject", JOptionPane.INFORMATION_MESSAGE);
        String fname = JOptionPane.showInputDialog(this, "Excel file name title", "Excel file name", JOptionPane.INFORMATION_MESSAGE); 
        filename = main.AttachLocation + fname + ".csv";
        .
        if (ret == JOptionPane.YES_OPTION) 
        {
            sendButton.setEnabled(true);
            cancelButton.setEnabled(false);            
            try
            {
                dateiStream = new FileWriter(logname); 
                ausgabe = new PrintWriter(dateiStream);
                dateiStream1 = new FileWriter(filename); 
                csvdata = new PrintWriter(dateiStream1);
                
                cancelButton.setEnabled(true);
                sendButton.setEnabled(false);
                t = new Thread(new Runnable() 
                { 
                    public void run() 
                    {    
                    for (k=0; k<leng && state == true; k++)
                    {
                    try
                    {
                        htmltable="<html><body><table border='1' cellpadding='0' cellspacing='0'>";
                        htmltable=htmltable + "<tr>";
                        for (int y=0; y<=selectedColumns.length-1;y++)
                        {
                            htmltable=htmltable + "<td width='175px'><div align='left'>[b]" + table.getColumnName(selectedColumns[y]) + "[/b]</div></td>";
                            csvdata.print(table.getColumnName(selectedColumns[y]) + ";");
                        }
                        htmltable=htmltable + "</tr><tr>";
                        csvdata.println(System.getProperty("line.separator"));                            
                        for (int y=0; y<=selectedColumns.length-1;y++)
                        {
                            main.appendSubject(ans);
                            yourValue = table.getModel().getValueAt(k, selectedColumns[y]); 
                            if (yourValue == null)
                                htmltable=htmltable+ "<td width='175px'><div align='left'>" + "" + "</div></td>";
                            else 
                                htmltable=htmltable+ "<td width='175px'><div align='left'>" + yourValue + "</div></td>";
                                
                            main.appendText(table.getColumnName(selectedColumns[y]) + ": " + yourValue + System.getProperty("line.separator"));
                            
                            Object CSVValue = table.getModel().getValueAt(k, selectedColumns[y]); 
                            csvdata.print(CSVValue + ";");
                        }                            
                        csvdata.close(); // Schliessen der .csv Datei
                        main.appendText(System.getProperty("line.separator"));
                        htmltable=htmltable + "</tr></table></body></html>";
                        
                        main.appendToEmail(getWert(k));
                                                                               
                        sendMail_Log();
                    }
                    catch (Exception e6)
                    {
                        JOptionPane.showMessageDialog(null, "Error: " + "\n" + e6.getMessage(), "Message", JOptionPane.ERROR_MESSAGE);
                    }
                    main.setVisible(false);
                }
                ausgabe.close();
                    }
                });
                t.start();
            }
            catch (Exception e7)
            {
                JOptionPane.showMessageDialog(null, "Error: Could not create file", "Message", JOptionPane.ERROR_MESSAGE); 
            }
      }
}

Code:
public void sendMail_Log() // Send Email and log
{
        Properties props=new Properties();
        if (main.INIHost != null)
            props.put("mail.smtp.host", main.INIHost);
                                            
        Session mailConnection=Session.getInstance(props,null);
        msg=new MimeMessage(mailConnection);
        
        try
        {
            if (main.INIEmailToBCC.equals(""))
            {
                to=new InternetAddress(main.toField.getText());
                from=new InternetAddress(main.INIEmailFrom);
            }    
            else
            {
                to=new InternetAddress(main.toField.getText());
                bcc=new InternetAddress(main.INIEmailToBCC);
                from=new InternetAddress(main.INIEmailFrom); 
                msg.setRecipient(Message.RecipientType.BCC, bcc);
            }
                 
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setContent(htmltable,"text/html; charset=ISO-8859-1");
            
            if (main.DataAttached.equalsIgnoreCase("no") | main.DataAttached.equals(""))
            {
                mp = new MimeMultipart();
                mp.addBodyPart(mbp1);
                
                currentDate = new java.util.Date();                 
                ausgabe.println("Mail" + (k+1) + " / " + currentDate + 
System.getProperty("line.separator") + "Host: " + 
main.hostField.getText() + " / " + "From: " + 
main.fromField.getText() + " / " + "To: " + 
main.toField.getText() + " / " + "BCC: " + 
main.toBCCField.getText() + " / " + "Subject: " + 
main.subjectField.getText() + System.getProperty("line.separator") + 
"Attached: -----" + System.getProperty("line.separator") + 
main.message.getText() + System.getProperty("line.separator")); 
            }
            else if (main.DataAttached.equalsIgnoreCase("yes"))
            {
                MimeBodyPart mbp2 = new MimeBodyPart();
                FileDataSource fds = new FileDataSource(filename);
                mbp2.setDataHandler(new DataHandler(fds));
                mbp2.setFileName(fds.getName());
            
                mp = new MimeMultipart();
                mp.addBodyPart(mbp1);
                mp.addBodyPart(mbp2);
                
                currentDate = new java.util.Date();                 
                if (main.AttachLocation.equals(""))
                    ausgabe.println("Mail" + (k+1) + " / " + currentDate + 
System.getProperty("line.separator") + "Host: " + main.hostField.getText() + 
" / " + "From: " + main.fromField.getText() + " / " + "To: " + 
main.toField.getText() + " / " + "BCC: " + main.toBCCField.getText() + 
" / " + "Subject: " + main.subjectField.getText() + System.getProperty("line.separator") + 
"Attached: " + main.getApplicationPath() + "\\" + filename + 
System.getProperty("line.separator") + main.message.getText() + 
System.getProperty("line.separator")); 
            }
                                        
            msg.setContent(mp);
            msg.setFrom(from);
            msg.setRecipient(Message.RecipientType.TO, to);
            msg.setSubject(main.subjectField.getText());
                                                                         
                    try
                    {
                        Transport.send(msg);
                    }
                    catch (Exception e4)
                    {
                        JOptionPane.showMessageDialog(null, "Error during transport:" + "\n" + e4.getMessage(), "Message", JOptionPane.ERROR_MESSAGE);
                    }
                    j=k+1;
                                    
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            bar.setValue(j);
                            valueProg.setText((j) + " of " + leng + " Emails");
                        }
                    });
                                                                                                                         
            main.message.setText("");
            main.subjectField.setText("");
        }
        catch (Exception e5)
        {
            JOptionPane.showMessageDialog(null, "Error during transport:" + "\n" + e5.getMessage(), "Message", JOptionPane.ERROR_MESSAGE);
        }
    }
 

Mag1c

Top Contributor
Hi,

zu 1.) genau das ist der Grund, warum dort nur der erste Eintrag drin steht. Du schließt csvdata innerhalb der Schleife und öffnest es nicht wieder. Verschiebe das Schließen bis nach dem Ende der for-Schleife.

zu 2.) Ich empfehle dir dringend, mal ein Refactoring zu machen, funktionale Einheiten zu bilden und in eigene Klassen auszulagern, die Verwendung von globalen Variablen zu reduzieren. Mit einer klareren Strukturierung wirst du auch selbst besser damit zurecht kommen.

Gruß
Mag1c
 
L

Louis2

Gast
Hallo,

zu 1) Ich wollte nicht alles in 1 Datei packen wie beim Log sondern einzeln... habe ich anders gelöst.
zu 2 und das Wiederaufsetzen nach dem Abbrechen) Also in der API steht "It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution." also muss ich mein Thread erstmal beenden bevor ich mit dem Wiederaufsetzen beginne.
So ich habe schonmal raus bei welcher Position das Wiederaufsetzen beginnen soll, bei welche Zeile in der JTable die Infos wieder geholt werden müssen.
Mein Problem ist einfach, dass beim Wiederaufsetzen nichts passiert ;-) Nur eine leer Log Datei wird geöffnet, ich habe es auch mit t.stop() probiert geht nicht, weiss jemand warum? Ich lade ja nur eine Methode... (die selbe wie immer --> also liegt es wohl am Thread der gerade läuft?)
Code:
if (action == cancelButton)
{
    if (state == true) // Wenn Senden läuft, Status True
    {
        stopSendingMail();
        cancelButton.setText("Continue?");
    }
    else if (state == false) // Wenn Senden abgebrochen, Status False
    {
        cancelButton.setText("Cancel");
        int nextValue = bar.getValue();
        start=nextValue;
        time = formatter.format(new java.util.Date());
        logname = main.LogLocation + "Log" + time + ".txt";
        t.stop(); // Thread von vorher beenden
        writeMail_Log(); // Methode nochmal laden
     }
}

Code:
public void writeMail_Log() // Write in Email body and log
{
    try
    {
        dateiStream = new FileWriter(logname); 
        ausgabe = new PrintWriter(dateiStream);
                                
        cancelButton.setEnabled(true);
        sendButton.setEnabled(false);
        t = new Thread(new Runnable() 
        { 
            public void run() 
            {                   
                for (k=start; k<leng && state == true; k++) // Infos werden ab k=start Wert geholt (siehe oben)
                {
                    try
                    {
                        dateiStream1 = new FileWriter(filename); 
                        csvdata = new PrintWriter(dateiStream1);
                        htmltable="<html><body><table border='1' cellpadding='0' cellspacing='0'>";
                        htmltable=htmltable + "<tr>";
                        for (int y=0; y<=selectedColumns.length-1;y++)
                        {
                            htmltable=htmltable + "<td width='175px'><div align='left'>[b]" + table.getColumnName(selectedColumns[y]) + "[/b]</div></td>";
                            csvdata.print(table.getColumnName(selectedColumns[y]) + ";");
                        }
                        htmltable=htmltable + "</tr><tr>";
                        csvdata.println(System.getProperty("line.separator"));                            
                        for (int y=0; y<=selectedColumns.length-1;y++)
                        {
                            main.appendSubject(ans);
                            yourValue = table.getModel().getValueAt(k, selectedColumns[y]); 
                            if (yourValue == null)
                                htmltable=htmltable+ "<td width='175px'><div align='left'>" + "" + "</div></td>";
                            else 
                                htmltable=htmltable+ "<td width='175px'><div align='left'>" + yourValue + "</div></td>";
                                
                            main.appendText(table.getColumnName(selectedColumns[y]) + ": " + yourValue + System.getProperty("line.separator"));
                            
                            Object CSVValue = table.getModel().getValueAt(k, selectedColumns[y]); 
                                csvdata.print(CSVValue + ";");
                        }                            
                        csvdata.close();
                        main.appendText(System.getProperty("line.separator"));
                        htmltable=htmltable + "</tr></table></body></html>";

                        main.appendToEmail(getWert(k));
                                                                               
                        sendMail_Log();
                    }
                    catch (Exception e6)
                    {
                        JOptionPane.showMessageDialog(null, "Error: " + "\n" + e6.getMessage(), "Message", JOptionPane.ERROR_MESSAGE);
                    }
                    main.setVisible(false);
                }
                ausgabe.close();
            }
       });
       t.start();

    }
    catch (Exception e7)
    {
        JOptionPane.showMessageDialog(null, "Error: Could not create file", "Message", JOptionPane.ERROR_MESSAGE); 
    }
}
 

Mag1c

Top Contributor
Hi,

du mußt den Thread nicht stoppen, da dieser sich selbst beendet, wenn du state auf false setzt. Du mußt allerdings, bevor du den nächsten Thread startest, state wieder auf true setzten, da sich sonst der neue Thread auch wieder gleich beendet.

Gruß
Mag1c
 
L

Louis2

Gast
Darauf hätte ich auch selber kommen können *schwach* :(
Naja danke für alles !!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Frage zum Quellcode - Zusammhänge und Ablauf. Java Basics - Anfänger-Themen 2
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
K For-Schleifen Ablauf Java Basics - Anfänger-Themen 5
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
CptK Klassen JPanel nach Ablauf der Spielzeit neuladen Java Basics - Anfänger-Themen 2
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4
H Modifizierte ArrayList für weiteren Ablauf beibehalten? Java Basics - Anfänger-Themen 12
M Einfacher Fenster-Ablauf Java Basics - Anfänger-Themen 5
R Programm nach ablauf eines Timers beenden Java Basics - Anfänger-Themen 10
K Zeit ablaufen lassen und nach Ablauf beenden Java Basics - Anfänger-Themen 5
J Ablauf im Skript/ Applet Java Basics - Anfänger-Themen 4
A Ablauf von Bytecode Transformation Java Basics - Anfänger-Themen 10
M Frage zum Ablauf eines Threads Java Basics - Anfänger-Themen 5
G Prinzipieller Ablauf bei Servlets Java Basics - Anfänger-Themen 25
W Eine Methode, mehrfacher gleichzeitger Ablauf möglich? Java Basics - Anfänger-Themen 2
missy72 Methoden Alle rekusiven Aufrufe abbrechen Java Basics - Anfänger-Themen 21
SaschaMeyer Iterationsdurchlauf abbrechen Java Basics - Anfänger-Themen 16
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
O Endlosschleife abbrechen Java Basics - Anfänger-Themen 10
M JOptionPane Fehler bei "Abbrechen" des Fensters Java Basics - Anfänger-Themen 10
OSchriever Exception für Abbrechen-Schaltfläche JOptionpane Java Basics - Anfänger-Themen 9
N Abbrechen einer Eingabe endet im Fehler Java Basics - Anfänger-Themen 3
M Abbrechen Methode ohne return Java Basics - Anfänger-Themen 3
C InputStreamReader Eingabeprozess abbrechen Java Basics - Anfänger-Themen 8
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
Z JTextField - getText() Methode abbrechen? Java Basics - Anfänger-Themen 8
A Gui Abbrechen Butto Java Basics - Anfänger-Themen 6
T thread abbrechen Java Basics - Anfänger-Themen 5
P Klassen Bei KeyEvent in KeyListener den Tastendruck abbrechen Java Basics - Anfänger-Themen 5
E Executorservice abbrechen? Java Basics - Anfänger-Themen 2
P Verschachtelte Schleife vorzeitig abbrechen. Java Basics - Anfänger-Themen 50
A for schleife frühzeitig abbrechen Java Basics - Anfänger-Themen 25
P Methoden Methode ohne return abbrechen? Java Basics - Anfänger-Themen 12
M Methode abbrechen funktioniert nicht?! Java Basics - Anfänger-Themen 2
M readXYZ von DataInputStream abbrechen/timeout auslösen Java Basics - Anfänger-Themen 6
M Objekterstellung abbrechen? Java Basics - Anfänger-Themen 10
F Methode abbrechen Java Basics - Anfänger-Themen 16
R JOptionPane funktioniert nicht mit Abbrechen Knopf Java Basics - Anfänger-Themen 16
J Frame schließen, Ereignis behandeln, Vorgang abbrechen Java Basics - Anfänger-Themen 4
B OOP Objekt klonen (Grundzustand), um in Editor "Abbrechen" zu können Java Basics - Anfänger-Themen 4
S [JAVA] Erstellung eines Objekts abbrechen?! Java Basics - Anfänger-Themen 7
brainray Server abbrechen mit CTRL-C Java Basics - Anfänger-Themen 2
Developer_X Endlos-Schleifen abbrechen Java Basics - Anfänger-Themen 5
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
S Schleife per Tastendruck abbrechen Java Basics - Anfänger-Themen 7
G Wie entferne ich einen "Abbrechen" Button? Java Basics - Anfänger-Themen 6
A JOptionPane -> abbrechen -> NullPointerException Java Basics - Anfänger-Themen 4
S While-Schleife nach 10 sekunden abbrechen. Java Basics - Anfänger-Themen 20
K void Methode abbrechen Java Basics - Anfänger-Themen 7
G jFileChooser auf den Abbrechen-Button reagieren Java Basics - Anfänger-Themen 3
W Schaltjahr abbrechen wenn <1583 Java Basics - Anfänger-Themen 11
G FileNotFoundException beim Drücken des "Abbrechen" Java Basics - Anfänger-Themen 3
B Programm abbrechen Java Basics - Anfänger-Themen 2
F while mit Enter-Taste abbrechen Java Basics - Anfänger-Themen 13
J Swing Komponente soll Thread starten und abbrechen Java Basics - Anfänger-Themen 6
P FileChooser richtig abbrechen? Java Basics - Anfänger-Themen 3
G REkursion vorzeitig abbrechen Java Basics - Anfänger-Themen 4
G while-Schleife von aussen abbrechen Java Basics - Anfänger-Themen 8
L read() (von bufferedReader) abbrechen Java Basics - Anfänger-Themen 5
G imports einlesen und nach den imports abbrechen Java Basics - Anfänger-Themen 4
V JOP.showInputDialog Abbrechen Button, Exception abfangen Java Basics - Anfänger-Themen 2
G while-Schleife global abbrechen Java Basics - Anfänger-Themen 2
N JOptionPane.showInputDialog Abbrechen abfragen Java Basics - Anfänger-Themen 5
N Konsole: while Schleife durch Tastensruck abbrechen Java Basics - Anfänger-Themen 4
S For-Schleife sauber abbrechen? Java Basics - Anfänger-Themen 9
F Methode abbrechen wie mit break in Schleifen ? Java Basics - Anfänger-Themen 2
S Wie kann ich abbrechen Java Basics - Anfänger-Themen 3
J Schleife vorzeitig abbrechen Java Basics - Anfänger-Themen 7
T Programm so abbrechen, dass finally ausgeführt wird Java Basics - Anfänger-Themen 7
R Abbrechen...aber wie??? Java Basics - Anfänger-Themen 3
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
B Zurück Button erstellen Java Basics - Anfänger-Themen 1
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
G Rekursive Methode liefert augenscheinlich keinen boolean-Wert zurück. Java Basics - Anfänger-Themen 4
H Ein gegebenes Int Array zu Zwei Arrays zurück geben Java Basics - Anfänger-Themen 6
P Verzweigungen Wert zurück geben Java Basics - Anfänger-Themen 2
D gebe string zurück mit von bis bestimmtes Zeichen Java Basics - Anfänger-Themen 4
L jar, class, java und wieder zurück Java Basics - Anfänger-Themen 8
MiMa Zurück zum Schleifenkopf Java Basics - Anfänger-Themen 6
D Funktion gibt Dimension zurück Java Basics - Anfänger-Themen 11
JavaNewbie2.0 Zur Anweisung zurück Java Basics - Anfänger-Themen 13
F Scanner - nextLine() gibt leeren String zurück Java Basics - Anfänger-Themen 2
Tommy Nightmare void Methode gibt Array zurück Java Basics - Anfänger-Themen 3
E Methoden Methode liefert keinen Wert zurück Java Basics - Anfänger-Themen 16
N Kalender - Tag addieren gibt 31. Juni zurück Java Basics - Anfänger-Themen 3
O Methoden geben nichts zurück Java Basics - Anfänger-Themen 6
F Array abarbeiten und bei Fehler zurück ins Array legen Java Basics - Anfänger-Themen 1
D Zurück Button -- Background wird nicht angezeigt Java Basics - Anfänger-Themen 4
W Input/Output DataOutputStream gibt NULL zurück Java Basics - Anfänger-Themen 5
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
N Variablen zurück casten Java Basics - Anfänger-Themen 3
O Methode gibt Null zurück Java Basics - Anfänger-Themen 7
C Input/Output System.in.read() gibt nicht -1 zurück? Java Basics - Anfänger-Themen 3
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
T Klassen wie funktionieren Streams, warum bekomme ich int zurück? Java Basics - Anfänger-Themen 2
D Methode die statt char[] ein "null" zurück gibt Java Basics - Anfänger-Themen 8
M Input/Output File.listFiles() gibt null zurück Java Basics - Anfänger-Themen 3
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
B Input/Output File.length() gibt bei vielen Ordnern 0 zurück Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben