Usuário com melhor resposta
Como fazer Loop Infinito

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 ?
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
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. -
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
-
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
-
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 ?
-
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); } }
-
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
-
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... :Ppelo 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; }