tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1271
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Igor1312 Igor1312 ist offline Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    22
    Hi,

    ich habe mit Netbeans eine Windows Desktopanwendung generiert. In der View-Klasse, dem sichtbaren Teil der Anwendung, ist ein Textfeld und ein Button. Der Button startet eine Prozedur, die von 1 bis 10 zählt und zwischendurch je 1 Sekunde wartet. Die Zahlen werden in dem Textfeld ausgegeben (textfeld.append()).

    Wenn ich das ohne Schnickschnack programmiere, erscheint die Ausgabe 1..10 erst, wenn die Prozedur beendet ist und die "Kontrolle" wieder die View-Klasse hat.

    Wie schicke ich die Prozedur in den Hintergrund (Swing, Runnable)?

    Netbeans bietet da eine Lösung.
    Hier der von Netbeans generierte Code der Prozedur, wenn man den Haken bei "Hintergrundaufgabe" setzt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    /**
     * Zählen und warten
     */
    @Action public Task machet() {
            return new MachetTask(org.jdesktop.application.Application.getInstance(machwas.MachwasApp.class));
    }
     
        private class MachetTask extends org.jdesktop.application.Task<Object, Void> {
            MachetTask(org.jdesktop.application.Application app) {
                // Runs on the EDT.  Copy GUI state that
                // doInBackground() depends on from parameters
                // to MachetTask fields, here.
                super(app);
            }
            @Override protected Object doInBackground() {
                // Your Task's code here.  This method runs
                // on a background thread, so don't reference
                // the Swing GUI from here.
                for (int i=1;i<10;i++){
                    System.out.println("Zahl: " + i);
                    myView.setTextfeld("Zahl: "+ i + "\n");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(MachwasApp.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
     
                return null;  // return your result
            }
            @Override protected void succeeded(Object result) {
                // Runs on the EDT.  Update the GUI based on
                // the result computed by doInBackground().
            }
        }

    Soweit so gut.

    1. Problem: Wenn man den Button bei 4 nochmal drückt, laufen zwei Tasks durcheinander ...
    Ich möchte aber mit der Ausführung warten, bis der erste fertig ist. Es geht mir hier in erster Linie um die Ausgabe von Zwischenergebnissen im Textfeld, nicht um die Ausführung im Hintergrund.

    2. Problem:
    Ich möchte die Schleife parametrisieren, also beim Druck auf den Button soll die GUI der Prozedur einen Parameter für die Anzahl der Schleifendurchläufe mitgeben.
    Der freundliche Hinweis von Netbeans
    // Runs on the EDT. Copy GUI state that
    // doInBackground() depends on from parameters
    // to MachetTask fields, here.
    soll mir wohl sagen, was zu tun ist, aber ich verstehe das nicht. Und das liegt nicht an meinen Englischkenntnissen. Wie kopiere ich Parameter in die Task-Fields? Und wie bzw. wo übergebe ich Parameter an MachetTask() ?

    Vielen Dank für jede Hilfe!

    Tschö,
    Igor
    Geändert von Igor1312 (19.02.10 um 17:19 Uhr)
     

  2. #2
    Igor1312 Igor1312 ist offline Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    22
    Keiner hat eine Idee dazu?
    Ich würde mich schon über Links zu hilfreichen Themen, von mir aus auch in anderen Foren oder auch nur über die richtigen Suchbegriffe freuen, damit ich was zu dem "Problem" finde ... Ich bin nämlich nicht nur neu, was Java Programmierung angeht, sondern auch Windows GUI ist Neuland.

    Kann doch nicht angehen, dass man mit Java keine Zwischenstände von Berechnungen ausgeben kann, um den Benutzer zu informieren. Strikt threadsafe oder was auch immer hin oder her.

    Tschö,
    Igor
     

  3. #3
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    1. Problem: Wenn man den Button bei 4 nochmal drückt, laufen zwei Tasks durcheinander ...
    Ich möchte aber mit der Ausführung warten, bis der erste fertig ist. Es geht mir hier in erster Linie um die Ausgabe von Zwischenergebnissen im Textfeld, nicht um die Ausführung im Hintergrund.
    Du könntest am Anfang deiner Prozedur deinen Button ausschalten und ihn am Ende deiner Prozedur wieder anschalten.

    2. Problem:
    Ich möchte die Schleife parametrisieren, also beim Druck auf den Button soll die GUI der Prozedur einen Parameter für die Anzahl der Schleifendurchläufe mitgeben.
    Der freundliche Hinweis von Netbeans
    // Runs on the EDT. Copy GUI state that
    // doInBackground() depends on from parameters
    // to MachetTask fields, here.
    soll mir wohl sagen, was zu tun ist, aber ich verstehe das nicht. Und das liegt nicht an meinen Englischkenntnissen. Wie kopiere ich Parameter in die Task-Fields? Und wie bzw. wo übergebe ich Parameter an MachetTask() ?
    Ich bin mir nicht sicher, ob ich es richtig verstanden hab, was du willst. Aber du könntest in deiner Klasse eine Variable deklarieren, die du vor deiner Prozedur änderst und auf welche deine Prozedur dann zugreift.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  4. #4
    Igor1312 Igor1312 ist offline Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    22
    Hallo HonniCilest,

    vielen Dank für deine Antwort.
    Leider geht deine Lösung am Problem vorbei.

    zu 1. Es geht nicht darum, dass diese Prozedur nur einmal laufen soll. Die gesamte Verarbeitung dse Programmes soll warten, bis der Task zu Ende ist. Es geht es mir im Grunde nur darum, das Textfeld, welches sich im GUI Task befindet aus einem anderen Task heraus zu aktualisieren. Das Referenzieren ist kein Problem. Aber das Textfeld wird eben erst dann aktualisiert, wenn der GUI Thread wieder den Fokus erhält, also nach Ausführung der Prozedur.

    zu 2. Ich möchte gerade nicht mit globalen (Klassen-)Variablen arbeiten, sondern mit Parametern. Wie geht das mit diesem Netbeans-Template? Ich verstehe die Kommentare im generierten Code nicht, bzw. weiß nicht wie ich es umsetzen muss.

    Tschö,
    Igor
     

  5. #5
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    erstens wie du es so schön sagst, dein GUI-Thread hat den Focus.
    Dein Task bzw das Event des Buttons wird genau in diesem Thread ausgeführt. Desalb kann natürlich auch nicht gezeichnet werden.

    Das heißt du musst das ganz in einen extra Thread ausladen. Da du das ganze dennoch nacheinander ausführen möchtest, würde sich ein SingleThreadExecutor anbieten.

    Code :
    1
    
    Executor executor = Executors.newSingleThreadExecutor();

    So wird nur ein Thread gleichzeitig ausgführt.

    EDIT:
    Ups, ich sehe du hast ja die Task-Klasse des ApplicationFrameworks. Da wird es ja angeblich im Hintergrund ausgeführt.

    Deine Befehle musst du dann in ein Runnable schreiben. Dieses kannst du dann mit submit im executor ausführen.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  6. #6
    Igor1312 Igor1312 ist offline Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    22
    Hi Sascha,

    vielen Dank für deine Antwort.
    erstens wie du es so schön sagst, dein GUI-Thread hat den Focus.
    Dein Task bzw das Event des Buttons wird genau in diesem Thread ausgeführt. Desalb kann natürlich auch nicht gezeichnet werden.
    Ich finde es gar nicht natürlich, weil wenn der Thread den Fokus hat, wieso kann er dann seine Steuerelemente nicht aktualisieren?

    Ansonsten verstehe ich leider nichts von dem, was du schreibst. Ist es möglich, dass du das mit ein paar Zeilen Code ausmalst, den ich zum Testen übernehmen kann? Ich bin leider blutiger Anfänger in Java UND Windows-Programmierung
    Netbeans hat ja schon ne ganze Menge hübschen Code generiert, aber der tut's nicht so, wie ich es gerne hätte. Wie muss ich den denn erweitern/ändern, damit genau das passiert, was ich beschrieben habe? Ich meine da insbesondere die Parameter-Geschichte, denn das Aktualisieren klappt ja mit dem Beispiel ganz prima, weil der Task machet() im Hintergrund läuft.

    Im Grunde ist dieses Problem doch ein Standard-Problem der GUI Programmierung, oder täusche ich mich? Das kann doch einfach nicht so kompliziert sein, dass einer wie ich es nicht kapiert! Auch wenn ich neu in Java und GUI bin, so bin ich nicht gerade begriffsstutzig.

    Tschö,
    Igor
     

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Ich hatte übersehen, dass du das ApplicationFramework nutzt.
    Da verhält sich das ganze ein bisschen anders.

    Hier ist eine kleine BeispielApplication. Die eigentlich das machen sollte was du möchtest.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    
    /*
     * DesktopApplication2View.java
     */
     
    package desktopapplication2;
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.jdesktop.application.Action;
    import org.jdesktop.application.ResourceMap;
    import org.jdesktop.application.SingleFrameApplication;
    import org.jdesktop.application.FrameView;
    import org.jdesktop.application.Task;
    import org.jdesktop.application.TaskMonitor;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.Timer;
    import javax.swing.Icon;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
     
    /**
     * The application's main frame.
     */
    public class DesktopApplication2View extends FrameView {
     
        public DesktopApplication2View(SingleFrameApplication app) {
            super(app);
     
            initComponents();
     
            // status bar initialization - message timeout, idle icon and busy animation, etc
            ResourceMap resourceMap = getResourceMap();
            int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
            messageTimer = new Timer(messageTimeout, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    statusMessageLabel.setText("");
                }
            });
            messageTimer.setRepeats(false);
            int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
            for (int i = 0; i < busyIcons.length; i++) {
                busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
            }
            busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                    statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
                }
            });
            idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
            statusAnimationLabel.setIcon(idleIcon);
            progressBar.setVisible(false);
     
            // connecting action tasks to status bar via TaskMonitor
            TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
            taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
                public void propertyChange(java.beans.PropertyChangeEvent evt) {
                    String propertyName = evt.getPropertyName();
                    if ("started".equals(propertyName)) {
                        if (!busyIconTimer.isRunning()) {
                            statusAnimationLabel.setIcon(busyIcons[0]);
                            busyIconIndex = 0;
                            busyIconTimer.start();
                        }
                        progressBar.setVisible(true);
                        progressBar.setIndeterminate(true);
                    } else if ("done".equals(propertyName)) {
                        busyIconTimer.stop();
                        statusAnimationLabel.setIcon(idleIcon);
                        progressBar.setVisible(false);
                        progressBar.setValue(0);
                    } else if ("message".equals(propertyName)) {
                        String text = (String)(evt.getNewValue());
                        statusMessageLabel.setText((text == null) ? "" : text);
                        messageTimer.restart();
                    } else if ("progress".equals(propertyName)) {
                        int value = (Integer)(evt.getNewValue());
                        progressBar.setVisible(true);
                        progressBar.setIndeterminate(false);
                        progressBar.setValue(value);
                    }
                }
            });
        }
     
        @Action
        public void showAboutBox() {
            if (aboutBox == null) {
                JFrame mainFrame = DesktopApplication2.getApplication().getMainFrame();
                aboutBox = new DesktopApplication2AboutBox(mainFrame);
                aboutBox.setLocationRelativeTo(mainFrame);
            }
            DesktopApplication2.getApplication().show(aboutBox);
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            mainPanel = new javax.swing.JPanel();
            jTextField1 = new javax.swing.JTextField();
            jButton1 = new javax.swing.JButton();
            menuBar = new javax.swing.JMenuBar();
            javax.swing.JMenu fileMenu = new javax.swing.JMenu();
            javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
            javax.swing.JMenu helpMenu = new javax.swing.JMenu();
            javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
            statusPanel = new javax.swing.JPanel();
            javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
            statusMessageLabel = new javax.swing.JLabel();
            statusAnimationLabel = new javax.swing.JLabel();
            progressBar = new javax.swing.JProgressBar();
     
            mainPanel.setName("mainPanel"); // NOI18N
     
            org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopapplication2.DesktopApplication2.class).getContext().getResourceMap(DesktopApplication2View.class);
            jTextField1.setText(resourceMap.getString("jTextField1.text")); // NOI18N
            jTextField1.setName("jTextField1"); // NOI18N
     
            javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(desktopapplication2.DesktopApplication2.class).getContext().getActionMap(DesktopApplication2View.class, this);
            jButton1.setAction(actionMap.get("doInBackGround")); // NOI18N
            jButton1.setName("jButton1"); // NOI18N
     
            org.jdesktop.layout.GroupLayout mainPanelLayout = new org.jdesktop.layout.GroupLayout(mainPanel);
            mainPanel.setLayout(mainPanelLayout);
            mainPanelLayout.setHorizontalGroup(
                mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(mainPanelLayout.createSequentialGroup()
                    .add(55, 55, 55)
                    .add(mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(jButton1)
                        .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(240, Short.MAX_VALUE))
            );
            mainPanelLayout.setVerticalGroup(
                mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(mainPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(28, 28, 28)
                    .add(jButton1)
                    .addContainerGap(136, Short.MAX_VALUE))
            );
     
            menuBar.setName("menuBar"); // NOI18N
     
            fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
            fileMenu.setName("fileMenu"); // NOI18N
     
            exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
            exitMenuItem.setName("exitMenuItem"); // NOI18N
            fileMenu.add(exitMenuItem);
     
            menuBar.add(fileMenu);
     
            helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
            helpMenu.setName("helpMenu"); // NOI18N
     
            aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
            aboutMenuItem.setName("aboutMenuItem"); // NOI18N
            helpMenu.add(aboutMenuItem);
     
            menuBar.add(helpMenu);
     
            statusPanel.setName("statusPanel"); // NOI18N
     
            statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N
     
            statusMessageLabel.setName("statusMessageLabel"); // NOI18N
     
            statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
            statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N
     
            progressBar.setName("progressBar"); // NOI18N
     
            org.jdesktop.layout.GroupLayout statusPanelLayout = new org.jdesktop.layout.GroupLayout(statusPanel);
            statusPanel.setLayout(statusPanelLayout);
            statusPanelLayout.setHorizontalGroup(
                statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
                .add(statusPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .add(statusMessageLabel)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 204, Short.MAX_VALUE)
                    .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(statusAnimationLabel)
                    .addContainerGap())
            );
            statusPanelLayout.setVerticalGroup(
                statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(statusPanelLayout.createSequentialGroup()
                    .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(statusMessageLabel)
                        .add(statusAnimationLabel)
                        .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(3, 3, 3))
            );
     
            setComponent(mainPanel);
            setMenuBar(menuBar);
            setStatusBar(statusPanel);
        }// </editor-fold>
     
        @Action
        public Task doInBackGround() {
            return new DoInBackGroundTask(getApplication());
        }
     
        private class DoInBackGroundTask extends org.jdesktop.application.Task<Object, Void> {
            DoInBackGroundTask(org.jdesktop.application.Application app) {
                // Runs on the EDT.  Copy GUI state that
                // doInBackground() depends on from parameters
                // to DoInBackGroundTask fields, here.
                super(app);
                System.out.println("test");
            }
     
     
            @Override protected Object doInBackground() {
                while(lock)
                    try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
     
                }
                lock = true;
                 for (int i=1;i<10;i++){
                    System.out.println("Zahl: " + i);
                    jTextField1.setText("Zahl: "+ i + "\n");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
     
                    }
                }
     
                return null;  //
            }
            @Override protected void succeeded(Object result) {
                lock = false;
            }
        }
     
     
        // Variables declaration - do not modify
        private javax.swing.JButton jButton1;
        private javax.swing.JTextField jTextField1;
        private javax.swing.JPanel mainPanel;
        private javax.swing.JMenuBar menuBar;
        private javax.swing.JProgressBar progressBar;
        private javax.swing.JLabel statusAnimationLabel;
        private javax.swing.JLabel statusMessageLabel;
        private javax.swing.JPanel statusPanel;
        // End of variables declaration
        private boolean lock = false;
        private final Timer messageTimer;
        private final Timer busyIconTimer;
        private final Icon idleIcon;
        private final Icon[] busyIcons = new Icon[15];
        private int busyIconIndex = 0;
     
        private JDialog aboutBox;
    }
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  8. #8
    Igor1312 Igor1312 ist offline Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    22
    Hi Sascha,

    danke, das ist super!

    Ich habe es bei der Aufteilung des Codes in View- und App-Klasse (EDT) gelassen und den ganzen doInBackground-Kram in die App-Klasse schreiben lassen. Macht keinen Unterschied, läuft!

    Der Code ist lustigerweise fast genau der, den ich gepostet habe, den Netbeans automatisch generiert hat.
    Zusätzlich hast du eine globale Variable lock und eine While-Schleife eingefügt und setzst die Variable in succeed() auf false.
    Und das macht den Unterschied

    Beim 2. Klick wartet der Task also darauf, dass der Vorgängertask lock=false setzt und läuft erst dann weiter. Ich habe statt while (lock) {} nur "if (lock) return null;" geschrieben. Dann werden die Buttonklicks während der Ausführung des Tasks quasi ignoriert. Ich möchte es so

    Ich habe vor die While-Schleife noch "int z = myView.getZaehler();" geschrieben. getZaehler() ist ein static Getter für ein Textfeld, in dem die Anzahl der Schleifendurchläufe steht. Mit deinem while(lock) passiert folgendes, wenn man den Button 2x klickt, dann den Wert ändert und ein drittes Mal klickt. Es ist passiert, dass der 3. Task vor dem 2. gestartet wurde und mit dem neuen Wert des Textfeldes arbeitet. Dann erst lief der 2. Task mit dem alten Wert. Auf ei Reihenfolge der Taskabarbeitung hat man wohl keinen Einfluss. Aber das ist im Moment nicht mein Problem, ich hab ja eine Lösung dagegen.

    Wenn man nun einen zweiten Button einbaut, der einen Vordergrund-Task startet, wird das richtig amüsant. Die Ausgabe wird wieder angehalten (im System.out sieht man aber, dass und wie es durcheinanderläuft) und am Ende stehen die Ergebnisse der Zählschleifen durcheinander. Nachvollziehbar, aber wenig deterministisch. Man muss also wenn schon immer mit lock arbeiten.

    Zum Schluss noch eine Frage.
    Was bedeutet das hier:
    // Runs on the EDT. Copy GUI state that
    // doInBackground() depends on from parameters
    // to DoInBackGroundTask fields, here.
    Ich übersetze das so: "Läuft im EventDispatchingThread (nicht die GUI, sondern die AppKlasse). Kopiere an dieser Stelle den GUI Status, also das, wovon doInBackground() abhängt, von den Parametern in die Felder des DoInBackGroundTask."
    Hier erfolgt also die von mir gewünschte Parameter-Übergabe und ich kann mir die getText-Methode sparen. Aber wie ist die Syntax dafür?

    Und dann hab ich noch eine Frage, aber dafür mache ich jetzt einen neuen Thread auf.

    Tschö,
    Igor
     

  9. #9
    Igor1312 Igor1312 ist offline Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    22
    Hi,

    ich hab das Problem mit der Parameterübergabe nun gelöst, mit einem weiteren Konstruktor:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     private class Machet_bTask extends Task<Object, Void> {
     
            /** Anzahl der Iterationen */
            private int iterations = 0;
     
            /** Erweiterter Konstruktor mit zusätzlichem Parameter */
            public Machet_bTask(Application app, int iterations) {
                // Runs on the EDT.  Copy GUI state that
                // doInBackground() depends on from parameters
                // to Machet_in_backTask fields, here.
                super(app);
                this.iterations = iterations;
            }
    [...]

    Der Aufruf über die @Action Methode:

    Code :
    1
    2
    3
    4
    
    @Action
      public Task machet_b() {
            return new Machet_bTask(getApplication(), myView.getZaehler());
        }

    myView .getZaehler() liefert den Wert aus einem Textfeld, in dem die Schleifendurchläufe stehen.

    Tschö,
    Igor
    Geändert von Igor1312 (03.03.10 um 14:54 Uhr)
     

Ähnliche Themen

  1. Anfänger Frage - Ausgabe in dyn. Textfeld
    Von ClaudiaGlade im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 01.12.08, 11:57
  2. Textfeld - Ausgabe grosser Texte
    Von mamue im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 28.06.05, 10:53
  3. Antworten: 1
    Letzter Beitrag: 18.10.04, 22:55
  4. Antworten: 5
    Letzter Beitrag: 11.07.04, 23:30
  5. Antworten: 5
    Letzter Beitrag: 10.07.04, 15:51

Stichworte