1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Dúvida SwingWorker em pesquisa

Boa tarde!

Criei uma consulta na qual após você digitar uma palavra, e dar qualquer pausa nesta digitação ela executa a SwingWorker para pesquisar o conteúdo. O método ficou com o nome de monitor(), Esta invoca uma nova SwingWorker chamada pesquisa(), A pesquisa, busca a informação que preciso e antes de sair do doInBackground(), invoca outra nova SwingWorker chamada buffer(), e segue o processo para atualizar o model e minha tabela no done(). O buffer é executado porque uso paginação, então enquanto o usuário pensa no que fazer outras paginas estão sendo carregadas sem que ele perceba. O atributo bandeira esta sendo setado quando entrar em uma zona critica de pesquisa, não haver conflito. Tudo isso foi usado para tentar melhorar performance, Coloquei um banco de dados em um servidor web e estou acessando via desktop. Minha maior dúvida é, thread chamando thread que chama outra thread pode dar conflito? Fiz uns testes e ficou legal a performance, entretanto em alguns casos quando atualizo a tabela, dispara uma exceção na linha model.fireTableRowsInserted(ipos, fpos);, O estranho é que estas referencias que passei estão certas porque logo acima esta fazendo o addRows. Por isso pensei que talvez possa ser algum conflito por estar usando desta forma. A excessão é apenas um numero "15" que justamente é a minha primeira paginação.

Sou novo em java, programava Cobol e atirava um pouco de pascal. Gostaria de algumas sugestões!

agradeço a atenção.

Monitor

    private void monitor() {
        SwingWorker worker = new SwingWorker() {
            boolean ativar = false;
            String conteudo = jTextField_Pesquisa.getText();
            String ord = ordem;

            @Override
            protected Object doInBackground() throws Exception {
                while (!stop) {
                    try {
                        Thread.sleep(5);
                        if (!conteudo.equals(jTextField_Pesquisa.getText())) {
                            conteudo = jTextField_Pesquisa.getText();
                            Thread.sleep(300);
                            if (conteudo.equals(jTextField_Pesquisa.getText())) {
                                while (bandeira) {
                                    try {
                                        Thread.sleep(5);
                                    } catch (Exception e) {
                                    }
                                }
                                pesquisar();
                            }
                        }
                    } catch (Exception e) {
                    }
                    ativar = false;
                }
                return null;
            }
        };
        worker.execute();
    }

Pesquisa

    private void pesquisar() {
        SwingWorker workerPesquisar = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {
                while (bandeira) {
                    Thread.sleep(5);
                }
                bandeira = true;
                verEventos(true);
                return null;
            }

            @Override
            protected void done() {
                nPular = 0;
                model.clearModel();
                setListAutoCompletar();
                jLabel_qtdReg.setText("Total de Registros encontrados: " + Integer.toString(qtdRegistrosFiltrados));
                JTableScroll.selectAndScroll(jTable_Eventos, 0);
                setListTotal();
                if (rowCount > -1) {
                    JTableScroll.selectAndScroll(jTable_Eventos, 0);
                }
                bandeira = false;
                bufferEventos();
            }
        };
        workerPesquisar.execute();
    }

buffer

    private void bufferEventos() {
        SwingWorker workerEventos = new SwingWorker() {
            int numRecord = 0;
            String conteudo;

            @Override
            protected Object doInBackground() throws Exception {
                flagBuffer = true;
                listaEventosBuffer.clear();
                try {
                    while (bandeira) {
                        try {
                            Thread.sleep(5);
                        } catch (Exception e) {
                        }
                    }
                    conteudo = jTextField_Pesquisa.getText();
                    if (!stop) {
                        bandeira = true;
                        EventosDao prgDao = new EventosDao();
                        paramDao.put("nRetornar", (15 * nRetornar));
                        paramDao.put("nPular", listaEventosTotal.size());
                        listaEventosBuffer = prgDao.selecaoEventos(paramDao);
                        numRecord = listaEventosBuffer.size();
                    }
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(rootPane, "Advertência em buffer backGround: " + e.getMessage());
                }
                return null;
            }

            @Override
            protected void done() {
                if (!stop) {
                    if (conteudo.equals(jTextField_Pesquisa.getText())) {
                        try {
                            int ipos = 0, fpos = 0;
                            for (int i = 0; i < listaEventosBuffer.size(); i++) {
                                if (!conteudo.equals(jTextField_Pesquisa.getText())) {
                                    break;
                                }
                                listaEventosTotal.add(listaEventosBuffer.get(i));
                                if (ipos == 0) {
                                    ipos = listaEventosTotal.size();
                                }
                                model.addRow(listaEventosBuffer.get(i));
                                fpos = ipos + i;
                            }
                            if (numRecord > 0) {
                                model.fireTableRowsInserted(ipos, fpos);
                            }
                        } catch (Exception e) {
                            JOptionPane.showMessageDialog(rootPane, "Advertência em buffer done: " + e.getMessage());
                        }
                    }
                }
                flagBuffer = false;
                bandeira = false;
            }
        };
        workerEventos.execute();
    }
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags swing threads ou faça a sua própria pergunta.