none
Como fazer Loop Infinito RRS feed

  • Pergunta

  •  public void ListarProcessos()
            {
                try
                {

                    while(true)
                    {
                        // Get all client processes.
                        Process[] ProcessKilled = Process.GetProcessesByName("HideTools");
                        // For every process that's running.
                        if (ProcessKilled.Length < 1)
                        {
                            Program.Exit = true;
                        }
                        foreach (Process ScanProcess in Process.GetProcesses())
                        {
                            // For every word in the blacklist.
                            foreach (string Word in this.ProcessWordBlacklist)
                            {
                                // Check for word in process name.
                                if (ScanProcess.ProcessName.ToLower().Contains(Word.ToLower()))
                                {
                                    // If found, kill all neuz processes and the cheat process.
                                    foreach (Process ProcessKill in ProcessKilled)
                                    {
                                        listBox1.Items.Add(listaDadosProcesso(ProcessKill));
                                        ProcessKill.Kill();
                                    }
                                    listBox1.Items.Add(listaDadosProcesso(ScanProcess));
                                    ScanProcess.Kill();
                                    break;
                                }
                            }

                        }

                    }

                }
                catch { }
            }

    Porem este código não deixa abrir meu FORM ! ele fica em loop mais não deixa meu form abrir corretamente ! como faço para esse while voltar ao inicio ? e verificar a cada determinado tempo ?

                                                                
    quarta-feira, 14 de novembro de 2012 13:56

Respostas

  • o único modo é utilizando um thread a mais... o problema do teu código é que ele vai executar o comando do loop e não saira deste ateh que tenha acabado ou seja nunca... tente jogar este método num thread do seguinte modo

    Thread tr = new Thread(Teste);
    tr.Start(ListarProcessos);

    deste modo a thread principal do teu form não será afetada pelo processamento deste loop... e adicione o comando Thread.Sleep(200) dentro do loop(while(true)) para ele dar uma pausa entre o processamento das threads....

    mas claro que isso é bem superficial, seria bom dar uma estudada em threads, segue um link bom para iniciantes..

    http://www.macoratti.net/10/09/c_thd1.htm


    lembrei de outra coisa, para forms a coisa sobe de nivel pq ele vai dar um erro ao acessar o controle da thread... então antes de efetuar qualquer alteração em algum controle do teu form tem que fazer a seguinte verificação

     private void Teste()
            {
                while(true)
                {
                    if (this.InvokeRequired)
                    {
                        this.BeginInvoke(new MethodInvoker(Teste));
                        return;
                    }
                    btnTeste.Text = "22";//controle acessado no teu caso iria os acessos ao listbox1.Add por exemplo
                    MessageBox.Show("hehuehu");
                    Thread.Sleep(1000);
                }
            }

    • Marcado como Resposta Kelvin Batista quarta-feira, 14 de novembro de 2012 14:50
    quarta-feira, 14 de novembro de 2012 14:30

Todas as Respostas

  • Seu loop sempre será infinito pois voce não tem nenhuma condição que force a saida do laço while.

    Uma sugestão, é sair do laço quando todos os processos do array ProcessKilled, forem finalizados.

    while (true)
    {
        // Get all client processes.
        Process[] ProcessKilled = Process.GetProcessesByName("HideTools");
        // For every process that's running.
        if (ProcessKilled.Length < 1)
        {
            Program.Exit = true;
        }
        foreach (Process ScanProcess in Process.GetProcesses())
        {
            // For every word in the blacklist.
            foreach (string Word in this.ProcessWordBlacklist)
            {
                // Check for word in process name.
                if (ScanProcess.ProcessName.ToLower().Contains(Word.ToLower()))
                {
                    // If found, kill all neuz processes and the cheat process.
                    foreach (Process ProcessKill in ProcessKilled)
                    {
                        listBox1.Items.Add(listaDadosProcesso(ProcessKill));
                        ProcessKill.Kill();
                    }
                    listBox1.Items.Add(listaDadosProcesso(ScanProcess));
                    ScanProcess.Kill();
                    break;
                }
            }
    
        }
    
        // Sai do while quando todos os processos forem finalizados
        if (ProcessKilled.Length <= 0)
        {
            break;
        }
    }

    Sempre tenha muito cuidado com laços do tipo while(true). Podem te dar muita dor de cabeça. :)

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    quarta-feira, 14 de novembro de 2012 14:15
  • o único modo é utilizando um thread a mais... o problema do teu código é que ele vai executar o comando do loop e não saira deste ateh que tenha acabado ou seja nunca... tente jogar este método num thread do seguinte modo

    Thread tr = new Thread(Teste);
    tr.Start(ListarProcessos);

    deste modo a thread principal do teu form não será afetada pelo processamento deste loop... e adicione o comando Thread.Sleep(200) dentro do loop(while(true)) para ele dar uma pausa entre o processamento das threads....

    mas claro que isso é bem superficial, seria bom dar uma estudada em threads, segue um link bom para iniciantes..

    http://www.macoratti.net/10/09/c_thd1.htm


    • Editado M a i c o n quarta-feira, 14 de novembro de 2012 14:18
    quarta-feira, 14 de novembro de 2012 14:17
  • o único modo é utilizando um thread a mais... o problema do teu código é que ele vai executar o comando do loop e não saira deste ateh que tenha acabado ou seja nunca... tente jogar este método num thread do seguinte modo

    Thread tr = new Thread(Teste);
    tr.Start(ListarProcessos);

    deste modo a thread principal do teu form não será afetada pelo processamento deste loop... e adicione o comando Thread.Sleep(200) dentro do loop(while(true)) para ele dar uma pausa entre o processamento das threads....

    mas claro que isso é bem superficial, seria bom dar uma estudada em threads, segue um link bom para iniciantes..

    http://www.macoratti.net/10/09/c_thd1.htm


    lembrei de outra coisa, para forms a coisa sobe de nivel pq ele vai dar um erro ao acessar o controle da thread... então antes de efetuar qualquer alteração em algum controle do teu form tem que fazer a seguinte verificação

     private void Teste()
            {
                while(true)
                {
                    if (this.InvokeRequired)
                    {
                        this.BeginInvoke(new MethodInvoker(Teste));
                        return;
                    }
                    btnTeste.Text = "22";//controle acessado no teu caso iria os acessos ao listbox1.Add por exemplo
                    MessageBox.Show("hehuehu");
                    Thread.Sleep(1000);
                }
            }

    • Marcado como Resposta Kelvin Batista quarta-feira, 14 de novembro de 2012 14:50
    quarta-feira, 14 de novembro de 2012 14:30
  • Sim mais onde eu iria colocar dentro do ListarProcessos isso ? pq eu venho do C++ e confundo ainda C# rsrsrs  ! se vc's poder dar mais uma luz ! pq o metodo teste que vc me indicou tem que ser direto no na lista de processos pq ele adiciona automatico os processos bloqueados que eu quero ! e como ficaria ?
    quarta-feira, 14 de novembro de 2012 14:41
  • olha eu não testei aqui mas creio que seja apenas isso

    private void Teste()
            {
                if (this.InvokeRequired)
                {
                    this.BeginInvoke(new MethodInvoker(Teste));
                    return;
                }
                while (true)
                {
                    // Get all client processes.
                    Process[] ProcessKilled = Process.GetProcessesByName("HideTools");
                    // For every process that's running.
                    if (ProcessKilled.Length < 1)
                    {
                        Program.Exit = true;
                    }
                    foreach (Process ScanProcess in Process.GetProcesses())
                    {
                        // For every word in the blacklist.
                        foreach (string Word in this.ProcessWordBlacklist)
                        {
                            // Check for word in process name.
                            if (ScanProcess.ProcessName.ToLower().Contains(Word.ToLower()))
                            {
                                // If found, kill all neuz processes and the cheat process.
                                foreach (Process ProcessKill in ProcessKilled)
                                {
                                    listBox1.Items.Add(listaDadosProcesso(ProcessKill));
                                    ProcessKill.Kill();
                                }
                                listBox1.Items.Add(listaDadosProcesso(ScanProcess));
                                ScanProcess.Kill();
                                break;
                            }
                        }
    
                    }
    
                    // Sai do while quando todos os processos forem finalizados
                    if (ProcessKilled.Length <= 0)
                    {
                        break;
                    }
                    Thread.Sleep(200);
                }
            }

    quarta-feira, 14 de novembro de 2012 15:22
  • talvez pra ficar mais facil pra você entender, da pra utilizar as threas e ao inves de ficar dando begininvoke  utilizar reflection para manipular os controles do windows forms... threads é um conceito dificil pra qualquer um, quanto mais pra alguem que parte do c++ pro c#... no exemplo do macoratti ele da uma função que se encaixa em qualquer tipo de controle, é só copiar o código dele e adaptar ao teu...

    http://www.macoratti.net/10/09/c_thd1.htm

    e se você olhar nos artigos dele vai encontrar um outro modo de fazer com o backgroundworker que é um componente(controle) do windows forms que faz essas chamadas de método assíncronas automaticamente... :P
    • Editado M a i c o n quarta-feira, 14 de novembro de 2012 15:39
    quarta-feira, 14 de novembro de 2012 15:38
  • talvez pra ficar mais facil pra você entender, da pra utilizar as threas e ao inves de ficar dando begininvoke  utilizar reflection para manipular os controles do windows forms... threads é um conceito dificil pra qualquer um, quanto mais pra alguem que parte do c++ pro c#... no exemplo do macoratti ele da uma função que se encaixa em qualquer tipo de controle, é só copiar o código dele e adaptar ao teu...

    http://www.macoratti.net/10/09/c_thd1.htm

    e se você olhar nos artigos dele vai encontrar um outro modo de fazer com o backgroundworker que é um componente(controle) do windows forms que faz essas chamadas de método assíncronas automaticamente... :P

    pelo o que eu entendi ficaria assim ! mesmo assim a nao fica em loop =/

     private void LogControl_Load(object sender, EventArgs e)
            {
                Thread trd = new Thread(new ThreadStart(this.ListarProcessos));
                trd.IsBackground = true;
                trd.Start();
                
            }
    
            public void ListarProcessos()
            {
                try
                {
                    
    
                    while(true)
                    {
                       
                        // Get all client processes.
                        Process[] ProcessKilled = Process.GetProcessesByName("HideTools");
                      
                        foreach (Process ScanProcess in Process.GetProcesses())
                        {
                            // For every word in the blacklist.
                            foreach (string Word in this.ProcessWordBlacklist)
                            {
                                // Check for word in process name.
                                if (ScanProcess.ProcessName.ToLower().Contains(Word.ToLower()))
                                {
                                    // If found, kill all neuz processes and the cheat process.
                                    foreach (Process ProcessKill in ProcessKilled)
                                    {
                                        listBox1.Items.Add(listaDadosProcesso(ProcessKill));
                                        ProcessKill.Kill();
                                    }
                                    listBox1.Items.Add(listaDadosProcesso(ScanProcess));
                                    ScanProcess.Kill();
                                    break;
                                }
                            }
                            
                        }
                        Thread.Sleep(1);
                    }
                    
                }
                catch { }
            }
           
    
            public string listaDadosProcesso(Process process)
            {
                string proc ="Processo Detectado: " + process.ProcessName.ToString();
                return proc;
            }

    quarta-feira, 14 de novembro de 2012 16:49