Impressão de travamento na aplicação

2 respostas
T

Olá, Estou com um probleminha sou novato em Java e OO, e estou desenvolvendo uma aplicação. No meio dela eu faço uma lista dos arquivos que estou pegando, esta funcionando, mas o pequeno problema é que ele processa tudo e exibe na tela tudo de uma vez. Eu gostaria q ele exibisse cada linha na Jtable assim que acabar de processá-la, pois qndo ele começa a processar dá a impressão que travou a aplicação e demora um poko msmo, +/- 9min para processar 20 arquivos e eu terei no mínimo uns 150 arquivos para prcessar (processar é buscar o caminho em uma tabela no banco, contar qntas linhas tem o arquivo, o tamanho do arquivo, renomear o arquivo), não queria q desse a impressão de travamento, por isso quero trazer cada linha após ter sido processada. Como posso fazer isto?? Segue abaixo o código:

public static void Listar() {
        while (modelo.getRowCount() > 0) {
            modelo.removeRow(0);
        }
        Date DateNow = new Date();		//Variavel com Data de Hoje
        DateNow.setDate(DateNow.getDate() - 1);	//Subtraindo Dias da Data Corrente
        SimpleDateFormat FormatDate = new SimpleDateFormat("yyyyMMdd");	//Setando Formato da Data
        String CurDate = FormatDate.format(DateNow);
        DecimalFormat Decimal = new DecimalFormat("0.0");
        Conectar();
        try {
            RSet = Stmt.executeQuery("Select * from Relatorios");
            
            while (RSet.next()) {
                
                int numLinhas = 0;
                String tamanho = null;
                File Arquivo = new File(RSet.getString("caminho").replace("yyyymmdd", CurDate));
                
                if (Arquivo.exists()) {
                    long date = Arquivo.lastModified();
                    DateFormat fmt = new SimpleDateFormat("HH:mm:ss");
                    String HourArq = fmt.format(date);
                    double size = Arquivo.length() * 1.0 / 1024;
                    long tamanhoArquivo = Arquivo.length();
                    FileInputStream fs = new FileInputStream(Arquivo);
                    DataInputStream in = new DataInputStream(fs);
                    LineNumberReader lineRead = new LineNumberReader(new InputStreamReader(in));
                    lineRead.skip(tamanhoArquivo);
                    numLinhas = lineRead.getLineNumber();
                    lineRead.close();
                    fs.close();
                    in.close();
                    if (size >= 1024) {
                        tamanho = Decimal.format(size / 1024) + " mb";
                    } else {
                        tamanho = Decimal.format(size) + " kb";
                    }
                    modelo.addRow(new Object[]{RSet.getString("cod_rel"), Arquivo.getName(), tamanho, numLinhas, HourArq + " hrs",                                                  Arquivo.getParent().replace("\\\\10.221.1.31\\d$\\ftpcorporativo", "")});
                    ok++;
                } else {
                    modelo.addRow(new Object[]{RSet.getString("cod_rel"), Arquivo.getName(), tamanho, numLinhas, "", Arquivo.getParent().replace("\\\\10.221.1.31\\d$\\ftpcorporativo", "")});
                    erro++;
                    tabela.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

                        public Component getTableCellRendererComponent(JTable table, Object value,
                                boolean isSelected, boolean hasFocus, int row, int column) {
                            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                            Object ref = table.getValueAt(row, 2);
                            if (ref == null) {
                                setForeground(Color.red);
                            } else {
                                setForeground(null);
                            }
                            return this;
                        }
                    });
                }
                resultTotal.setText("" + tabela.getRowCount());
                resultOk.setText("" + ok);
                resultErro.setText("" + erro);
            }
            RSet.close();
            Connect.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            e.printStackTrace();
        }
        erro = 0;
        ok = 0;
    }

2 Respostas

H

Olá,

Tenho a impressão que você está falando de Threads… Que dá a possibilidade de executar 2 processos simultaneamente (Que seria fazer esta busca de dados e deixar a tela liberada, sem travar).

segue uma referência: http://www.devmedia.com.br/articles/post-4459-Utilizando-Threads-parte-1.html

Valeu

aix

pois é, eu trabalhei em um sistema parecido onde tive que fazer muitos tipos de validação faziamos normalização desses dados, dados fiscais, e muitas vezes dados vindos de outros bancos e muitas conexões ativas, e tudo era muito braçal, quando comecei a trabalhar neste sistema tinha o mesmo problema relatado por você, então criei as threads funcionou até relativo bem, porém as importações dos arquivos começaram a chegar em cargas maiores muitas vezes compactados e em muitos formatos, para se ter uma ideia uma das empresas que utilizava o sistema chagava a enviar 100 mil notas fiscais dia(xml), então temos processos que ficam rodando no banco por horas as veses até dias, é um sistema de auditoria fiscal, então chegou num ponto que cuidar de muitas threads ativas ficou cansativo, foi quando migramos tudo para webservices, cada processo que ficava dentro de uma thread eu criei um webservice, e o mesmo que era encarregado de cuidar das threads, nunca mais tivemos problemas.

Criado 29 de dezembro de 2011
Ultima resposta 29 de dez. de 2011
Respostas 2
Participantes 3