Bem, nao eh nada garantido pela VM :roll:
Só o join garente que primeiro roda o process, pra em seguida continuar… :?
Olá
Ted, aí vai um exemplo. Só que não tive tempo de procurar muito. Então vai nu e cru. Espero que entenda o modo de usar:
[code]import foxtrot.Task;
import foxtrot.Worker;
. . . . . . . .
private void btnGetPassword_ActionPerformed() {
firePropertyChange(BUTTON, NOT_PRESSED, PRESSED);
lblPassIcon.setVisible(false);
Task task = new Task() {
public Object run() throws InterruptedException {
readPass();
return null;
}
};
try {
Worker.post(task);
} catch(Exception ignored) {
firePropertyChange(BUTTON,PRESSED,NOT_PRESSED);
DebugTrace.println(ignored);
}
}[/code]
O Modelo é quase sempre o mesmo:
[code]import foxtrot.Task;
import foxtrot.Worker;
. . . . . . . .
Task task = new Task() {
public Object run() throws InterruptedException {
pegaUmObjeto().processaAlgumaCoisa();
return null;
}
};
try {
Worker.post(task);
} catch(Exception ignored) {
DebugTrace.println(ignored); // Imprime exceção
}
}[/code]
[]s
Luca
é galera, não rolou!!!
Se meu tableModel tiver carga sob demanda vou ter que me acustumar com as telas cinzas…
Com o Foxtrot, a tela ficava totalmetne perdida e com threads o máximo que deu para fazer foi trazer as linhas em branco em preencher conforme as mesmas fossem buscadas. Mas o efeito foi muito estranho, acho q vou deixar com os freeze ao menos nessa parte do sistema.
Valeu a força Luca e brlima
Olá
Pena.
Mas com foxtrot rola. Um dia com mais calma dê uma outra tentada. Na aplicação em que usei tinha também TableModel. Pena que a aplicação seja muito complexa e é meio difícil separar exemplos.
[]s
Luca
Sinceramente, achei meio estranho esse negocio de separar o processo de ir buscar os dados celula a celula… Nao consegui imaginar a situação ainda… :roll: Só vendo mesmo…
Mas imaginei algo do tipo separando o processo de criar a linha no tablemodel. Dai, nao ficaria esse negocio de ter a linha em branco e ir jogando os valores… A linha iria aparecer qdo estivesse carrega jah…
Essa busca sob demanda dos valores acho q seria melhor fazer em outro lugar ou de outro jeito…
Nao tem como ?
O problema é o seguinte, supomos q faça uma consulta de 3000 linhas de retorno. O rowcount vem através de um count dessas linhas, que é rápido. Entretanto se eu fizesse a query dos 3000 resultados isso ficaria muito lento, então a idéia foi a seguinte, buscar em blocos, ou seja, a primeira vez é buscado 200 linhas, quando o cliente requisitar mais (através da Scrollbar) será feita a busca. Mas veja bem que a scrollbar já tem rolagem pros 3000.
Vou fazer mais uns testes aqui, mas o estranho é que fiz um exemplo com o foxtrot simples, substitui a busca por um Thread.sleep() e não funcionou, a pintura da tela ficou muito estranha.
Olá
[size=“7”]<meiosemjeitodeperguntar>[/size]Você está usando rowset?[size=“7”]</meiosemjeitodeperguntar>[/size]
[]s
Luca
Nop… Na verdade eu tenho uma classe que implementa List, dai meu tableModel trabalha diretamente com Lists…
Só q esse meu list faz a carga de acordo com o que vc pede (só que através de blocos)…
Hmmm, não se essa informação te ajuda???
Ahhh, só para complementar, o acesso aos dados é feito através do Hibernate, mas no meio disso tudo o List acessa um SessionBean para buscar os dados!!!
Olá
Na verdade rowsets não tem nada a ver com freeze GUIs. Mas se vc usasse jdbc direto para buscar pingadinho na base seria meio ruim.
[]s
Luca
hahaha, isso tá parecendo um chat!!!
Bem, a idéia do cache é mais ou menos assim o List (vamos chamá-lo de ValueList) requisita linhas para um SessionBean Stateful. O sateful pede um bloco grande para o banco (supomos que seja 200 registros) e retorna um cache de, por exemplo, 100 para o ValueList. Quando o get do ValueList pedir o objeto 101, o mesmo ira acessar o stateful que retornará mais 100 direto do cache. Agora se o ValueList pedir o objeto 201, o stateful fará uma consulta ao banco trazendo do 200 ao 400 e retornará novamente do 200 até o 300 para o ValueList.
Não sei se consegui me explicar…
Segue abaixo um tableModel de exemplo que eu fiz para testar, mas o mesmo causa um loucura na pintura da tela:
class Model extends AbstractTableModel {
private String[][] data = { { "T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }
};
public int getColumnCount() {
return 2;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount() {
return data.length;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
public Object getValueAt(int rowIndex, int columnIndex) {
Task task = new Task() {
public Object run() throws InterruptedException {
Thread.sleep(500);
return null;
}
};
try {
Worker.post(task);
} catch (Exception ignored) {}
return data[rowIndex][columnIndex];
}
}
Veja que estou usando o sleep para simular a busca de dados.
Fallow
[quote=“Luca”]Olá
Na verdade rowsets não tem nada a ver com freeze GUIs. Mas se vc usasse jdbc direto para buscar pingadinho na base seria meio ruim.
[]s
Luca[/quote]
pq?
Olá
Bruno, antes de existirem os rowsets, a gente fazia uma consulta grande e o próprio driver ficava indo várias vezes ao banco paginando a consulta. Isto implicava em longa espera e o tempo todo com a conexão aberta. Agora com os rowsets se pode ir ao banco (tantas vezes qto o driver precisar), popular um arraylist e fechar a conexão. Para a tela vai o resultado do arraylist.
Bem, mas isto é papo para quem ainda usa JDBC (como infelizmente aqui).
[]s
Luca
:? :roll: Aqui tb…
O projeto ja eh um pouco antigo… entao…
Vou ver se acho alguns exemplos de rowset por ai… Eu montei um SQL pra ficar pegando de tanto em tanto no banco, mas acho q soh funfa no oracle… eh bonzinho, tah em produção ai ja algum tempo , mas …
Flw!