2010-12-20 15 views
0

내가 어떻게 할 수 있었는지 궁금했다. 정지GUI에서. 단추가 만들어지기 전에 스레드가 만들어 졌다면 JProgressBar를 넣어서 업데이트 할 수 있다고 생각했습니다. 그래서 지금 어떻게해야 할 지 모르겠다. 네가 도와 준다면 좋을거야.어떻게 GUI에서 스레드 단추를 멈출 수 있습니까?

미리 감사드립니다.

코드 :

import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.StringSelection; 
import javax.swing.JOptionPane; 

public class mainJFrame extends javax.swing.JFrame { 

    //set Global variables 
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    final int screenH = dim.height, screenW = dim.width; 
    private volatile boolean isStop = true; 

    public mainJFrame() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked")       
    private void initComponents() { 

     jProgressBar1 = new javax.swing.JProgressBar(); 
     jLabel1 = new javax.swing.JLabel(); 
     jTextField1 = new javax.swing.JTextField(); 
     jButton1 = new javax.swing.JButton(); 
     jButton2 = new javax.swing.JButton(); 
     jMenuBar1 = new javax.swing.JMenuBar(); 
     jMenu1 = new javax.swing.JMenu(); 
     jMenuItem1 = new javax.swing.JMenuItem(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setTitle("Zeveso's MD5 Cracker"); 
     setBounds(new java.awt.Rectangle(200, 200, 0, 0)); 
     setResizable(false); 

     jLabel1.setText("MD5:"); 

     jButton1.setText("Start"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     jButton2.setText("Stop"); 
     jButton2.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton2ActionPerformed(evt); 
      } 
     }); 

     jMenu1.setText("File"); 

     jMenuItem1.setText("Create MD5"); 
     jMenuItem1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jMenuItem1ActionPerformed(evt); 
      } 
     }); 
     jMenu1.add(jMenuItem1); 

     jMenuBar1.add(jMenu1); 

     setJMenuBar(jMenuBar1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) 
        .addGroup(layout.createSequentialGroup() 
         .addComponent(jLabel1) 
         .addGap(18, 18, 18) 
         .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)) 
        .addGroup(layout.createSequentialGroup() 
         .addComponent(jButton1) 
         .addGap(18, 18, 18) 
         .addComponent(jButton2))) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel1) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGap(18, 18, 18) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jButton1) 
        .addComponent(jButton2)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE) 
       .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap()) 
     ); 

     pack(); 
    }      

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     if(isStop == true){ 
     jProgressBar1.setIndeterminate(true); 
     myMDThread.start(); 
     isStop = false; 
     } 
     else{ 
      System.out.println("Already running!"); 
     } 
    }           

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {           
     createMD5 myMD = new createMD5(); 
     String myPass = JOptionPane.showInputDialog(null, "Please put your password!"); 
     myPass = myMD.getMD5(myPass); 
     JOptionPane.showMessageDialog(null, "MD5: " + myPass); 
     System.out.println(myPass); 
     Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     StringSelection stringSelection = new StringSelection(myPass); 
     clipboard.setContents(stringSelection, null); 
    }           

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
     jProgressBar1.setIndeterminate(false); 
     isStop = true; 
    }           


    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new mainJFrame().setVisible(true); 
      } 
     }); 
    }     
    private javax.swing.JButton jButton1; 
    private javax.swing.JButton jButton2; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JMenu jMenu1; 
    private javax.swing.JMenuBar jMenuBar1; 
    private javax.swing.JMenuItem jMenuItem1; 
    private javax.swing.JProgressBar jProgressBar1; 
    private javax.swing.JTextField jTextField1;     
} 

답변

1

것은 당신이 당신의 스레드에 대한 소스를 가지고 있습니까?

일반적으로 스레드를 중지 할 수 없으면 스레드를 중지 할 수 없습니다. 예를 들어, 스레드가 호출 될 때 플래그를 설정하는 stopProcessing과 같은 메소드를 노출 할 수 있습니다. 스레드의 run 메소드는 주기적으로이 플래그를 검사하여 중지해야하는지 확인합니다.

이 작업에 매우 적합하지 않은 작업이있는 경우 스레드를 무시하고 진행률 표시 줄을 숨기고 스레드가 중단되었다는 환상을주는 것이 유일한 옵션입니다.

+0

포인트의 주력점에 동의하지만 나만의 플래그와 방법을 정의 할 필요는 없습니다. 이것은 정확히'Thread.interrupt'와'Thread.interrupted' 메소드가있는 것입니다. –

+0

@Neil Bartlett - Java 1.5에는 중단 된 스레드가 ClassLoader에 있었던 경우로드하려고했던 클래스가 ClassNotFound로 영구적으로 표시된다는 재앙적인 버그가 있다는 것을 제외하고는 예외입니다. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4764778 –

3

스레드를 강제 종료하는 안전한 방법은 없습니다 (자세한 설명은 Thread.stop() 메서드에서 JavaDoc을 읽으십시오).

가장 좋은 방법은 interrupt 메서드를 호출하는 것입니다.이 메서드는 "협동"중지입니다. 스레드가 인터럽트 가능한 호출 중간에 있다면 InterruptedException을 던집니다. 쓰레드가 연산 집약적이라면 주기적으로 자신의 인터럽트 상태를 Thread.interrupted()으로 확인하고 요청시 완전히 종료해야합니다.

관련 문제