Problem thread java
saghir
Messages postés
13
Statut
Membre
-
danimo -
danimo -
Bonjour,
on clique en start l'application est plante
import javax.swing.*;
public class pointage extends JFrame {
public pointage() {
initComponents();
this.setVisible(true);
}
private void s() {
Thread sec = new Thread();
int cpt = 0;
while (true) {
try {
sec.sleep(1000);
} catch (Exception err) {
JOptionPane.showMessageDialog(null, err);
}
lCpt.setText(String.valueOf(cpt++));
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
lCpt = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 255, 255));
jButton1.setText("start");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(180, 180, 180)
.addComponent(jButton1)
.addContainerGap(223, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(259, Short.MAX_VALUE)
.addComponent(lCpt, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(157, 157, 157))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(274, Short.MAX_VALUE)
.addComponent(lCpt, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(78, 78, 78)
.addComponent(jButton1)
.addGap(135, 135, 135))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(null, "heure");
s();
JOptionPane.showMessageDialog(null, "heure");
}
public static void main(String args[]) {
new pointage();
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel lCpt;
// End of variables declaration
}
on clique en start l'application est plante
import javax.swing.*;
public class pointage extends JFrame {
public pointage() {
initComponents();
this.setVisible(true);
}
private void s() {
Thread sec = new Thread();
int cpt = 0;
while (true) {
try {
sec.sleep(1000);
} catch (Exception err) {
JOptionPane.showMessageDialog(null, err);
}
lCpt.setText(String.valueOf(cpt++));
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
lCpt = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 255, 255));
jButton1.setText("start");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(180, 180, 180)
.addComponent(jButton1)
.addContainerGap(223, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(259, Short.MAX_VALUE)
.addComponent(lCpt, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(157, 157, 157))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(274, Short.MAX_VALUE)
.addComponent(lCpt, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(78, 78, 78)
.addComponent(jButton1)
.addGap(135, 135, 135))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(null, "heure");
s();
JOptionPane.showMessageDialog(null, "heure");
}
public static void main(String args[]) {
new pointage();
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel lCpt;
// End of variables declaration
}
4 réponses
-
Salut,
On ne plante pas, mais on ne sort jamais de la boucle while(true){ de la méthode s()
Cordialement,
Dan-
-
-
-
Juste un petit test à faire:
Tout d'abord il faut enlever int cpt = 0; et le mettre dans les déclarations de variables private int cpt = 0; (je suppose qu'à terme ce compteur sera remplacé par l'heure).
Ajouter un break après lCpt.setText(String.valueOf(cpt++));
Supprimer aussi
s();
//JOptionPane.showMessageDialog(null, "heure"); <<<<<<<<<<<<<
dans ActionEvent
Et tu constateras que le label est mis à jour après chaque clique sur Start et OK de la boîte heure.
Ce qui montre (pour le moment) l'inutilité de la boucle while(true){
et même du sleep( et aussi du Thread, mais sans en abandonner l'idéeJuste un petit test à faire:
Tout d'abord il faut enlever int cpt = 0; et le mettre dans les déclarations de variables private int cpt = 0; (je suppose qu'à terme ce compteur sera remplacé par l'heure).
Ajouter un break après lCpt.setText(String.valueOf(cpt++));
Supprimer aussi
s();
//JOptionPane.showMessageDialog(null, "heure"); <<<<<<<<<<<<<
dans ActionEvent
Et tu constateras que le label est mis à jour après chaque clique sur Start et OK de la boîte heure.
Ce qui montre (pour le moment) l'inutilité de la boucle while(true){
et même du sleep( et aussi du Thread, mais sans en abandonner l'idée...)
Après ce test, si tu veux, on tentera de voir comment faire ce Thread. -
Merci danimo Je vous remercie de vos efforts et vous remercie pour votre peine et
Adhan, mais je n'ai pas me comprendre, je vais essayer d'expliquer l'idée plus
Le but ce JFrame (partie de l'application) Est-ce quand vous appuyez sur le bouton start le comptoir 0123 tantque boucle En cours
(Lorsque vous appuyez sur le bouton stop Contre arrêt, et cela plus tard)
et merci d'avance bien sur
-
-
Salut,
Bon j'ai modifié to programme comme ci-dessous:import javax.swing.*; import java.awt.event.*; public class Pointage extends JFrame { public Pointage() { initComponents(); this.setVisible(true); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jButton1 = new javax.swing.JButton(); lCpt = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(255, 255, 255)); jButton1.setText("start"); jButton1.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { jButton1.setEnabled(false); // création du Thread d'exécution Thread sec = new Thread() { public void run() { //int cpt = 0; while (cpt != 41) { try { Thread.sleep(1000); } catch (Exception err) { JOptionPane.showMessageDialog(null, err); } System.out.println("cpt = " + cpt); lCpt.setText(String.valueOf(cpt++)); } cpt = 0; jButton1.setEnabled(true); } }; sec.start(); } } ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(180, 180, 180) .addComponent(jButton1) .addContainerGap(223, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(259, Short.MAX_VALUE) .addComponent(lCpt, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(157, 157, 157)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(274, Short.MAX_VALUE) .addComponent(lCpt, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(78, 78, 78) .addComponent(jButton1) .addGap(135, 135, 135)) ); pack(); }// </editor-fold> public static void main(String args[]) { new Pointage(); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JLabel lCpt; private int cpt = 0; // PENSER METTRE CPT ICI <<<<<<<<<<<<<<<< // End of variables declaration }
Pour l'instant, il fonctionne jusqu'à ce que cpt = 40.
On peut le modifier en ajoutant un bouton Stop, si tu veux on le fera après.
Tu remarqueras que lorsqu'on clique Start le bouton devient inactif, il redevient actif quand cpt arrive à 40 et on peut de nouveau faire une série de 40 en cliquant Start.
Cordialement,
Dan -
-
je vous remercie pour votre réponse et pour votre aide et aussi pour le temps que vous avez perdu à cause de moi