Ir para conteúdo
  • 0

[Duvida] Como coloco delay em um for?


Solitario

Pergunta

Tipo ... to removendo muitos blocos ai termina lagando ... Gostaria de colocar um delay para começar ir dando paradas a x blocos ou se tiver outro jeito já é bem util também...

 

CODE:

			Bukkit.getScheduler().runTaskAsynchronously(HG.getInstance(), new Runnable() {
				@Override
				public void run() {
					int removidos = 0;
					for (Iterator<?> i = Manager.getInstance().construcao.iterator(); i.hasNext(); ) {
						removidos++;
						Block b = (Block) i.next();
						b.setType(Material.AIR);
						if(removidos == 80) {
							removidos = 0;
						}
					}
				}
			});
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

E se chamar uma sync dentro do for?

Aí o Thread.sleep() não pararia o thread principal.

Bukkit.getScheduler().runTaskAsynchronously(HG.getInstance(), new Runnable() {
				@Override
				public void run() {
					int removidos = 0;
					for (Iterator<?> i = Manager.getInstance().construcao.iterator(); i.hasNext(); ) {
						removidos++;
						Block b = (Block) i.next();
                                                Bukkit.getScheduler().runTask(HG.getInstance(), new Runnable() {
				                    @Override
				                    public void run() {
						        b.setType(Material.AIR);
                                                    }
                                                });
						if(removidos == 80) {
							removidos = 0;
						}
                                                Thread.sleep(1000);
					}
				}
			});
Link para o comentário
Compartilhar em outros sites

Thread.sleep(500);

@Edit
Você está alterando um mundo async? Melhor usar sync.. mas assim já não poderá usar Thread.sleep.
 

Editado por MrTBR
Arrumando post.
Link para o comentário
Compartilhar em outros sites

	public void test() {
		for (int i = 0; i < 50; i++) {
			try {
				Bukkit.broadcastMessage("-- " + i);
				Thread.sleep(1000); //1000 ms = 1 s
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

como ele falou ali em cima, isso faz o codigo esperar um tempo... 

Yh27b48.png

 

mas acho que isso faz parar tudo '-

Editado por FilipeNock
Link para o comentário
Compartilhar em outros sites

 

Bukkit.getScheduler().runTaskAsynchronously(HG.getInstance(), new Runnable() {
				@Override
				public void run() {
					int removidos = 0;
					for (Iterator<?> i = Manager.getInstance().construcao.iterator(); i.hasNext(); ) {
						removidos++;
						Block b = (Block) i.next();
                                                Bukkit.getScheduler().runTask(HG.getInstance(), new Runnable() {
				                    @Override
				                    public void run() {
						        b.setType(Material.AIR);
                                                    }
                                                });
						if(removidos == 80) {
							removidos = 0;
						}
                                                Thread.sleep(1000);
					}
				}
			});

 

Boa.

Dúvida: quebra 1 bloco por segundo no código?

Link para o comentário
Compartilhar em outros sites

Thread.sleep(500);

 

@Edit

Você está alterando um mundo async? Melhor usar sync.. mas assim já não poderá usar Thread.sleep.

 

'-'? Não entendi como assim mundo async? (Fiz como você deixou nesse outro)

 

 

Bukkit.getScheduler().runTaskAsynchronously(HG.getInstance(), new Runnable() {
				@Override
				public void run() {
					int removidos = 0;
					for (Iterator<?> i = Manager.getInstance().construcao.iterator(); i.hasNext(); ) {
						removidos++;
						Block b = (Block) i.next();
                                                Bukkit.getScheduler().runTask(HG.getInstance(), new Runnable() {
				                    @Override
				                    public void run() {
						        b.setType(Material.AIR);
                                                    }
                                                });
						if(removidos == 80) {
							removidos = 0;
						}
                                                Thread.sleep(1000);
					}
				}
			});

Só que não aconteceu nada '-'

 paxUlYE.png

 

mw51O7M.png

 

 

	public void test() {
		for (int i = 0; i < 50; i++) {
			try {
				Bukkit.broadcastMessage("-- " + i);
				Thread.sleep(1000); //1000 ms = 1 s
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

como ele falou ali em cima, isso faz o codigo esperar um tempo... 

Yh27b48.png

 

mas acho que isso faz parar tudo '-

 

Laga o servidor enteiro só normal ;-;

 

@Edit

 

Ta.. ou não aconteceu nada ou é muito lento mesmo kaofkasifaksdf (Vou testar com - delay)

 

@Edit2

Ta................ É tipo ... vai fila por fila ... pra notar isso tive que colocar Thread sleep em 1 '-' ... tem como acelerar + um pouquinho .-.?

 

@Edit3

queria fazer +/- assim .-. só que não quebra

		Bukkit.getScheduler().runTaskAsynchronously(HG.getInstance(), new Runnable() {
			@Override
			public void run() {
				int counter = 0;
				for (Iterator<?> i = Manager.getInstance().coliseu.iterator(); i.hasNext(); ) {
					Block b = (Block) i.next();
					b.setType(Material.AIR);
					counter++;
					if(counter == 30) {
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						counter = 0;
					}
				}
			}
		});
Editado por Solitario
Link para o comentário
Compartilhar em outros sites

Se você ta fazendo plugin de hg, acho melhor fazer por shematic, por conta que

Com a quantidade de Players, e a quantidade de blocos a ser removido, pode lagar e cair o server.

Remover com schematic .-.?

 

Tava trabalhando em uma api só pra destruir ... porém deu erro .. 

g8Zew3E.png

public class DestruirAPI {
    private HashMap<Integer, ArrayList> sessions = new HashMap<>();
    private int countersessions = 0;
    public DestruirAPI(ArrayList<Block> blocks){
        int conteio = 0;
        int sessiontemp = 0;
        ArrayList<Block> allowed = new ArrayList<>();
        for (Block bloco : blocks){
            if(bloco.getType() != Material.AIR && bloco != null){
                allowed.add(bloco);
            }
        }
        countersessions = allowed.size() / 500;
        Bukkit.getConsoleSender().sendMessage("§eDestruirAPI founded "+ allowed.size()+ " blocks ... spliting in " +countersessions + " tasks");
        for(int contando = 0; contando != countersessions; contando++){
            sessions.put(contando, new ArrayList());
        }
        for(int i = 1; i != allowed.size(); i++){
            if(blocks.get(i) != null && blocks.get(i).getType() != Material.AIR) {
                ArrayList<Block> blocosatuais = sessions.get(sessiontemp);
                blocosatuais.add(allowed.get(i));
                sessions.put(sessiontemp, blocosatuais);
                conteio++;
                if (conteio == 30) {
                    sessiontemp++;
                    conteio = 0;
                }
            }
        }
    }

    public void start(){
        for(int trocando = 0;trocando != countersessions;trocando++){
            Bukkit.getScheduler().runTaskAsynchronously(HG.getInstance(), new Runnable() {
                @Override
                public void run() {
                    System.out.println(trocando +" "+ sessions.size());
                    System.out.println(sessions.get(trocando));
                    if(sessions.get(trocando) != null) {
                        for (Iterator<?> i = sessions.get(trocando).iterator(); i.hasNext(); ) {
                            Block b = (Block) i.next();
                            Bukkit.getScheduler().runTask(HG.getInstance(), new Runnable() {
                                @Override
                                public void run() {
                                    b.setType(Material.AIR);
                                }
                            });
                        }
                    }
                }
            });
        }
    }

Notei que tem um delay fazer só em um async ... coloquei vários só que parei ai por que não quer dar certo e tentando colocar por fora ele parece que só chega a testar o ultimo '-' 

 

@Edit

Eu tava lendo que tem jeito pra colocar por chunks ... só não sei como funciona dizem que não laga ..-.. e parece que o FastAsyncWorldEdit faz isso...

Editado por Solitario
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...