Loop for

4 respostas
E

Bom dia galera!
To com problema com o Access again :S
É o seguinte tenho um loop for que é executado por uma thread. Para cada loop desse for,
dados são inseridos no banco do Access. O problema é que com o access quando abrimos muitas consultas
ao mesmo tempo dá general error :\ Então a thread executa um loop após o outro e como muitas consultas são abertas dá o erro.
Por isso eu precisava que cada loop do for fosse executado ATÉ O FIM, antes do próximo loop começar a ser executado.
Tem algum modo de eu fazer isso ? Trocar os loops ou sei lá.
Qualquer coisa me ajudaria, agradeço desde já. Segue o código da minha thread. Vlw !

public class Thread1 extends Thread{

    public Object[] dados;
    
    public void run(){
            for(int i=0; i<dados.length; i ++){
                for(int j=0; j<90; j++){
                    if(dados[i].equals("Arquivo "+j)){
                        
                        TableA t = new TableA();
                        t.TransferirDados();
                        t = null;
                        TableB t1 = new TableB();
                        t1.TransferirDados(j);
                        t1 = null;
                        System.gc();
                        
                    }
                }
            }
    }
    
    public void pegarValores(DefaultListModel list){
        
        dados = new Object[list.getSize()];
        for(int i=0; i<list.getSize(); i++){
            dados[i] = list.get(i);
            
        }
    }
}

4 Respostas

D

Tente utilizar Synchrozined Methods

exemplo:

public class Thread1 extends Thread{  
  
    public Object[] dados;  
      
    public void run(){  
           
                          exemplo();
                    }  
                }  
            }  
    }  
    public synchronized void exemplo(){
            for(int i=0; i<dados.length; i ++){  
                for(int j=0; j<90; j++){  
                    if(dados[i].equals("Arquivo "+j)){  
                          
                        TableA t = new TableA();  
                        t.TransferirDados();  
                        t = null;  
                        TableB t1 = new TableB();  
                        t1.TransferirDados(j);  
                        t1 = null;  
                        System.gc();  
    }
    public void pegarValores(DefaultListModel list){  
          
        dados = new Object[list.getSize()];  
        for(int i=0; i<list.getSize(); i++){  
            dados[i] = list.get(i);  
              
        }  
    }  
}
marciosouzajunior

Não creio que o problema seja fazer o loop executar até o fim, mas de qualquer forma tenta descobrir quantas consultas você pode fazer e caso esteja no limite peça a thread para dormir um pouco antes de continuar.

G
diego123321:
Tente utilizar Synchrozined Methods

exemplo:

public class Thread1 extends Thread{  
  
    public Object[] dados;  
      
    public void run(){  
           
                          exemplo();
                    }  
                }  
            }  
    }  
    public synchronized void exemplo(){
            for(int i=0; i<dados.length; i ++){  
                for(int j=0; j<90; j++){  
                    if(dados[i].equals("Arquivo "+j)){  
                          
                        TableA t = new TableA();  
                        t.TransferirDados();  
                        t = null;  
                        TableB t1 = new TableB();  
                        t1.TransferirDados(j);  
                        t1 = null;  
                        System.gc();  
    }
    public void pegarValores(DefaultListModel list){  
          
        dados = new Object[list.getSize()];  
        for(int i=0; i<list.getSize(); i++){  
            dados[i] = list.get(i);  
              
        }  
    }  
}

mas ai a thread não fez sentido algum

E

Bom, o limite de consultas é muito pequeno. O loop é executado uma vez normal, na segunda já da erro.
Ou seja, eu queria que ele só fosse para o próximo loop quando todas as consultas já tivessem sido realizadas e fechadas.
Tipo um loop por vez sempre. Eu teria que colocar um sleep no final de cada loop então ? Isso não pararia as consultas tbm não ?
E qual a diferença com esse synchronized method ?
Abraçãao galera ! Obrigado msm !

Criado 14 de março de 2012
Ultima resposta 15 de mar. de 2012
Respostas 4
Participantes 4